数独の問題作成
今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();
}
}
お礼
ありがとうございます。 なるほどという感じがします。 >あくまでも「内へ入れても勝てる!」と思ってのことです。 この部分が大事ですね。 そうでなければ、無気力相撲と同じで八百長ですからね。