可能性の重複:
Sudoku solver in java, using backtracking and recursion数独再帰はバックトレイン中に問題があります。 (ブルートフォース)
私は再帰とブルートフォースを使用して数独を解決するプログラムを作成しています。私の重要な問題は、どうやって止まってしまったのかを私が理解していないということです。
は数独でのゼロの数を探す:
プログラムの一般的なアルゴリズムは次のようです。
最初の0(getNextEmptyメソッドでこれを行います)の位置に数字を挿入します(insertNumberは値がスドクルールに準拠していることを確認し、そうであればtrueを返します)。
次に、再帰呼び出しを行います。ゼロがなくなると終了します(nはゼロの数です)。
プログラムが停止したポイントに達すると、ピースを変更するためにバックトラックする必要があります。しかし、これはどのように可能ですか?
実際には、セルクラスは調整するセルの位置を[row、column]の形式の配列に保持します。そのセルに関連付けられた行、列、またはより小さなグリッドを返すメソッドがあります。
私は手持ちまたはすべてのコードを要求していませんが、正しい方向のちょっとした動きで十分です。再帰の理解に正当な関心があります。
public static int[][] getSolution(int[][] grid) {
for (int i = 0; i < 9; i++) {
System.arraycopy(grid[i], 0, SolveSudoku.grid[i], 0, 9);
}// end for
int n = getZeroes();
return getSolution(n);
}//end getSolution
private static int[][] getSolution(int n) {
if (n == 0) {
return grid;
}//end if
Cell cell = getNextEmpty();
boolean fits = false;
for (int i = 0; i <= 9; i++) {
fits = insertNumber(cell, i);
if (fits) {
break;
}else {
//I do not understand what I should do here
}
}//end for
return getSolution(n - 1);
}//end getSolution
「ブルートフォース」? – Lion
はい、それは動作するまですべての組み合わせを試すことです。スドクを解く計算されたアプローチではなく。 – Tony
これが真剣な強さに半分合理的であるかどうかを調べるために、いくつかのバック・オブ・ザ・エンベロープの計算をしましたか?私は問題があまりよく分かりませんが、これは私が「難しい」パズルを取得した場合、数百年または数千年にわたり回転できるものとして私を襲います。あるいは、あなたが不可能なものを手に入れれば、ずっとずっと長くなります(あなたは間違ったパスをすべて列挙しなければなりません)。 – yshavit