アプリ版:「スタンプのみでお礼する」機能のリリースについて

今C#で数独の問題を作成するプログラムを作ろうと思っています。
数独についてはhttp://gdb.on.arena.ne.jp/PZ/PLACE/を見てください。
まずはhttp://gdb.on.arena.ne.jp/PZ/PLACE/のルールに反しないように
9*9マスに数字を入れるプログラムを作って見たのですが途中で止まってしまいます。
途中で止まる原因がわかる方がいましたら原因を教えて下さい。
お願いします。

using System;

class sudoku
{
Random random = new Random();
private int r;
private int i, j;
private int[,] X = new int[9, 9];

public sudoku()
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
r = random.Next(1, 10);
X[i, j] = r;
hikaku();
}
}
}

public void hikaku()
{
while (true)
{
int start1 = 0, start2 = 0, end2 = 0, shoki1, shoki2, a, b,x,y,z;
x = 0; y = 0; z = 0;
//縦についての設定
if (i == 0 || i == 1 || i == 2)
{ start1 = 0; }
if (i == 3 || i == 4 || i == 5)
{ start1 = 3; }
if (i == 6 || i == 7 || i == 8)
{ start1 = 6; }
//横についての設定
if (j == 0 || j == 1 || j == 2)
{ start2 = 0; end2 = 2; }
if (j == 3 || j == 4 || j == 5)
{ start2 = 3; end2 = 5; }
if (j == 6 || j == 7 || j == 8)
{ start2 = 6; end2 = 8; }
//ループで□内を検索
for (shoki1 = start1; shoki1 <= i; shoki1++)//縦ループ
{
for (shoki2 = start2; shoki2 <= end2; shoki2++)
{
if (i == shoki1 && j == shoki2)
{
break;
}
if (X[i, j] == X[shoki1, shoki2])
{
r = random.Next(1, 10);
X[i, j] = r;
x = 1;
}
}
}
//ここから横を比較
for (b = 0; b < j; b++)
{
if (X[i, j] == X[i, b])
{
r = random.Next(1, 10);
X[i, j] = r;
y = 1;
}
}
//ここから縦を比較
for (a = 0; a < i; a++)
{
if (X[i, j] == X[a, j])
{
r = random.Next(1, 10);
X[i, j] = r;
z = 1;
}
}
if (x == 0 && y == 0 && z == 0)
{
break;
}
}
Console.Write("{0} ", X[i, j]);//途中で止まるので何処までいったかの表示用
}
public void Write()
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
Console.Write("{0} ",X[i, j]);
}
Console.WriteLine();
}
}

static void Main()
{
sudoku S = new sudoku();
S.Write();
}
}

A 回答 (4件)

原因判明。



例えば途中までのデータが
325618497
798245613
164397582
813962745
94278136○

となったとしよう。X[4,4]には何を入れたらよいか?

165294873
938576124
274381695
591628347
642957○××

X[6,4]に入れることが出来る数字は何?
    • good
    • 0
この回答へのお礼

回答有難う御座います。値を入れることが出来ない状況が発生していたわけですね。

何回か繰り返して進展がないなら一行戻ってやり直すように
書き直した所上手くいくようになりました。

これで丸一日悩んでいましたがようやく次に進めそうです。
本当に有難う御座いました。

お礼日時:2007/12/24 23:26

勘違いだったみたい。

撤回。whileの直後にあるね
    • good
    • 0

#1のソースは読んでないけど。


途中で止まる原因についてヒント出しておくよ。

x = 1,y = 1,z = 1って3つの代入文は何のためにあるんだろうね。

「フラグ立てておいて,その地点では選出しなおさずチェックだけにしておいて,全てのチェックが終わった後にどれかが1ならば,ランダムに選びなおし」
ならわかるんだけど
「一致しなかったときランダムに選びなおしてフラグを立てる。【で元に戻さない】」の?

あと,多分選びなおした後の数字についてはチェックしてないのかな?これ。

#メソッド名が「比較」なんだから
「選びなおし」は別メソッドにしようぜ?
    • good
    • 0

ええとですね。


こう言う場合は「他人が書いたソースコードを読んでみる」と言うのが一番なのです。
誰の?と思うかもしれませんが、そう言う事が可能なように「オープンソースソフトウェア」ってのがあるんですね。全てのソフトウェアのコードが商用製品みたいに「ブラックボックス」だったら誰のソースも参考に出来ませんが、そう言う「不都合を避ける」為にフリーソフトウェア運動とか、オープンソース運動、ってのがあるのです。お分かりでしょうか?
オープンソースで「数独」のソースも公開されています。ダウンロードして調べてみてください。ANSI Cで書かれている模様です。

Sudoku ホームページ:
http://www.laurasia.com.au/sudoku/

そこに「Downloads:」ってのがある筈です。一つはUnix用のSudokuのソースコード、もう一つはMicrosoft Windows用のソースとバイナリです。
ソースコードを読んで頑張って勉強してみてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!