私は可能な最初の解決策のみを返すSudokuソルバーを作成しようとしています。 私はすべての可能な解決方法をvoidメソッドで表示することができましたが、最初の検索では止められません。このバックトラッキングでのみ最初の解決策を見つける方法
私は、好ましい方法は、boolean型メソッドに切り替えて、ツリーまでtrue
を返すことです知っている - が、私はそれを書くための正しい方法を見つけることができません。
私はいつもコンパイルエラー(method must return boolean
)を試してみました。
public boolean recursiveSolve(int line, int column) {
if(line == N) // N is the board size (9)
return true;
// if Cell is not empty - continue
if(board1.getCell(line, column) != 0) {
return nextCell(line, column);
}
// if Cell empty - solve
else {
for(int i = 1; i <= N; i++) {
board1.setCell(line, column, i); // set value to cell
if(board1.boardIsOk()) // check if the board is legal
return nextCell(line, column); // continue
}
board1.setCell(line, column, 0); // backtrack
}
}
private boolean nextCell(int line, int column) {
if(column < 8)
return recursiveSolve(line, column+1); // progress up the row
else
return recursiveSolve(line+1, 0); // progress down the lines
}
ご協力いただければ幸いです。
数独には1つの解決策しかないはずですか? –
.boardIsOk()はどこから来ますか?また、nextCellを変数に格納し、forループの実行ごとにそのvarの値をチェックする必要があることが分かります。ヴァルがあなたが望む何かを襲ったら、戻ってください。 – Kristian
@EmilVikström:コンハンダー1は空のボードでこのメソッドをアクティブにします。 – amit