我正在为一个类制作一个SudokuSolver,而我在使用solve方法时遇到了麻烦。我目前的解决方案使用递归回溯(我认为)。
int solve() - 尝试使用上述策略解决难题。返回解决方案的数量。
(上述策略)
为某个地点指定一个数字时,请不要指定一个与该地点的行,列或方格冲突的数字。我们很谨慎地将法律数字分配给某个地点,而不是分配任何数字1..9并在递归后期找到问题。假设初始网格都是合法的,之后只进行合法的分配。
我可以迭代地关注这个小输入。例如,假设我必须处理未解决的Cell#1和Cell#2。 #1有可能{1,3},#2有可能{2,3}。我会那么
set 1 to 1
set 2 to 2
hasConflicts? 0 : 1
set 2 to 3
hasConflicts? 0 : 1
set 1 to 3
set 2 to 2
hasConflicts? 0 : 1
set 2 to 3
hasConflicts? 0 : 1
public int solve() {
long startTime = System.currentTimeMillis();
int result = 0;
if (!hasConflicts()) {
Queue<VariableCell> unsolved = getUnsolved();
reduceUnsolvedPossibilities(unsolved); // Gets the possibilities down from all of 1-9
if (!hasConflicts()) {
result = solveRec(unsolved);
}
}
mElapsedTime = System.currentTimeMillis() - startTime;
return result;
}
protected int solveRec(Queue<VariableCell> unsolved) {
if (unsolved.isEmpty()) {
return (hasConflicts()) ? 0 : 1;
}
int result = 0;
VariableCell cell = unsolved.remove();
Iterator<String> possibilityIt = cell.getPossibilities().iterator();
while (possibilityIt.hasNext()) {
cell.setSymbol(possibilityIt.next());
if (hasConflicts()) {
possibilityIt.remove();
} else {
++result;
}
}
return result + solveRec(unsolved);
}
testSolveSingleSolution
expected 1, actual 1
testSolveSolved
expected 1, actual 1
testSolveUnsolvable
expected 0, actual 0
testSolveMultiSolutions
expected 2, actual 7 // MAJOR PROBLEM!
之前我已经完成了递归回溯,我已经查看了上面的所有链接以及更多,我仍然遇到了麻烦。我认为问题在于我在思考如何解决这个问题。 (请参阅Pseudocode Idea。)使用递归回溯进行详尽搜索是否合适?回溯正确,但实施错误?有没有比递归回溯更好的算法?
答案 0 :(得分:0)
这看起来像是一个实现问题。检查增加结果的块。你真的想为该单元格的每个有效值增加吗?如果存在多个有效值,那么覆盖旧的有效值?