我尝试实现一个Sudoku-Solver。我正在调用printSoluition(board)方法,它应该打印出解决方案,如果存在或为null。
我正在尝试一个有一个解决方案的例子。但它总是返回null。
我的代码:
static void printSolution(SudokuBoard board) {
SudokuBoard resultBoard = findSolution(board);
if(resultBoard != null) {
resultBoard.print();
}
}
static SudokuBoard findSolution(SudokuBoard board) {
if (board.isSolved()) {
return board;
} else {
int nextEmptyField = getNextFreeIndex(board);
if (nextEmptyField != -1) {
int[] kandidaten = board.getCandidates(nextEmptyField);
for (int i = 0; i < kandidaten.length; i++) {
SudokuBoard newBoard = board.set(nextEmptyField,
kandidaten[i]);
return findSolution(newBoard);
}
}
return null;
}
}
答案 0 :(得分:2)
你的回溯实现的递归是不正确的,因为你的for
循环永远不会超过第一个候选者。
您需要将循环更改为仅在找到解决方案时返回:
for (int i = 0; i < kandidaten.length; i++) {
SudokuBoard newBoard = board.set(freiesNaechstesFeld, kandidaten[i]);
SudokuBoard solution = findSolution(newBoard);
if (solution != null {
return solution;
}
}
现在所有调用级别的所有候选人都会被尝试,所以最终你会得到一个解决方案(当然,假设找到并设置候选人的“帮助者”方法工作正常)。