|
分類:[C#]
はじめて質問させて頂きます。 今数独の問題を自動で作成するプログラムを作っています。 その足がかりとしてまず9*9の二次元配列に * 空いているマスに1〜9のいずれかの数字を入れる。 * 縦・横の各列及び、太線で囲まれた3×3のブロックに同じ数字が複数入ってはいけない。 のルールを守りながらランダムに数字を入れていくプログラムを作ったのですが ほとんどの確率で何も表示されません。時間がやたらかかるのかと思って6*6マスにしたら 何回か実行するとたまに表示される程度です。 何処が間違ってるかわからないので何か間違いがありましたらご教示お願いします。
using System;
class sudoku { System.Random rnd = new System.Random(); public int Random; public int i, j; public int[,] X = new int[9, 9]; public sudoku() { for (i = 0; i < 9; i++) for (j = 0; j < 9; j++) { Random = rnd.Next(1, 10); X[i, j] = Random; hikaku(); } } public void hikaku() { ST1:;//最初から int start1=0,end1=0,start2=0,end2=0,shoki1,shoki2,A,B; //縦についての設定 if (i == 0 || i == 1 || i == 2) { start1 = 0; end1 = i; } if (i == 3 || i == 4 || i == 5) { start1 = 3; end1 = i; } if (i == 6 || i == 7 || i == 8) { start1 = 6; end1 = i; } //横についての設定 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 <= end1; shoki1++) { for (shoki2 = start2; shoki2 <= end2; shoki2++) { if (i == shoki1 && j == shoki2) { goto ST2; } if (X[i, j] == X[shoki1, shoki2]) { Random = rnd.Next(1, 10); X[i, j] = Random; goto ST1;//値を変えたら最初からやり直す } } } ST2:;//終わり次第強制終了 //ここから横を比較 for (B = 0; B < j; B++) { if (X[i, j] == X[i, B]) { Random = rnd.Next(1, 10); X[i, j] = Random; goto ST1;//値を変えたら最初からやり直す } } //ここから縦を比較 for (A = 0; A < i; A++) { if (X[i, j] == X[A, j]) { Random = rnd.Next(1, 10); X[i, j] = Random; goto ST1;//値を変えたら最初からやり直す } } } 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 A = new sudoku(); A.Write(); } }
|