バックトラックを使用してSudokuソルバーを作成するプログラムを作成しようとしています。私は黒い数独グリッドを作成することができ、移動が有効な移動であるかどうかを確認することができます。私のプログラムは、正方形に対して複数の選択肢があるまでうまく動作します。C++での再帰的なバックトラッキング
問題:私のSolveメソッドを見て、それを修正してバックトラックし、答えを変更し、再び前進する方法を見てください。私は上記のすべての他の方法の名前とそれらの仕事のすべてを与えました。
例入力:
int board[ROWS][COLS] = {
{ 6, 0, 3, 0, 2, 0, 0, 9, 0 },
{ 0, 0, 0, 0, 5, 0, 0, 8, 0 },
{ 0, 2, 0, 4, 0, 7, 0, 0, 1 },
{ 0, 0, 6, 0, 1, 4, 3, 0, 0 },
{ 0, 0, 0, 0, 8, 0, 0, 5, 6 },
{ 0, 4, 0, 6, 0, 3, 2, 0, 0 },
{ 8, 0, 0, 2, 0, 0, 0, 0, 7 },
{ 0, 1, 0, 0, 7, 5, 8, 0, 0 },
{ 0, 3, 0, 0, 0, 6, 1, 0, 5 }
};
bool sudokuBoard::emptyCell(int i, int j);
bool sudokuBoard::isValidCol(int i, int j, int number);
bool sudokuBoard::isValidRow(int i, int j, int number);
bool sudokuBoard::isValidSquare(int i, int j, int number);
bool sudokuBoard::validMove(int i, int j, int number);
void sudokuBoard::solvePuzzle(int row, int col) {
for (int i = 1; i < 10; i++) {
if (validMove(row, col, i)) {
board[row][col] = i;
showBoard();
}
}
if (row < 8 && col < 8) {
if (col < 8) {
solvePuzzle(row, col + 1);
}
else {
col = 0;
solvePuzzle(row + 1, col);
}
}
}
例電流出力:
6 5 3| 1 2 8| 4 9 0|
0 0 0| 0 5 0| 0 8 0|
0 2 0| 4 0 7| 0 0 1|
--------------------------------
0 0 6| 0 1 4| 3 0 0|
0 0 0| 0 8 0| 0 5 6|
0 4 0| 6 0 3| 2 0 0|
--------------------------------
8 0 0| 2 0 0| 0 0 7|
0 1 0| 0 7 5| 8 0 0|
0 3 0| 0 0 6| 1 0 5|
7にその前4が変化しない限り、解が存在しないので、私のプログラムは、最初の行の最後の0で停止し、プログラムは終了する。
再帰的なバックトラックのバックトラッキング部分が欠落しているようです。 – hellyale
さて、私はずっと笑っていました。ちょうどその仕組みや実装方法はわかりません。 – Asuu
showboardの後に最初のループの中にsolvePuzzleコールを入れてみてください。 – hellyale