こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

数独の問題作成

今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();
}
}

投稿日時 - 2007-12-24 14:36:05

QNo.3623731

すぐに回答ほしいです

質問者が選んだベストアンサー

原因判明。

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

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

165294873
938576124
274381695
591628347
642957○××

X[6,4]に入れることが出来る数字は何?

投稿日時 - 2007-12-24 22:25:28

お礼

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

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

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

投稿日時 - 2007-12-24 23:26:04

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

勘違いだったみたい。撤回。whileの直後にあるね

投稿日時 - 2007-12-24 21:07:14

#1のソースは読んでないけど。
途中で止まる原因についてヒント出しておくよ。

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

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

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

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

投稿日時 - 2007-12-24 21:02:11

ANo.1

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

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

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

投稿日時 - 2007-12-24 16:11:21