重複の可能性:
Java の数独ソルバー、バックトラッキングと再帰を使用
再帰と総当たりを使用して数独を解くプログラムを作成しています。私の主な問題は、行き詰まったものを元に戻す方法を理解できないことです。
プログラムの一般的なアルゴリズムは次のとおりです。
数独のゼロの数を見つけます。
最初の 0 の位置に (getNextEmpty メソッドがこれを行います)、数字を挿入します (insertnumber は、値が数独ルールに準拠していることを確認し、準拠している場合は true を返します)。
次に、再帰呼び出しを行い、ゼロがなくなったら終了します (n はゼロの数です)。
プログラムが動かなくなった場合は、後戻りして部分を変更する必要があります。しかし、これはどのように可能ですか?
Cell クラスは、調整するセルの位置を [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