作业要求
int solve() — tries to solve the puzzle using the strategy described above. Returns the number of solutions.
(上述策略)
When assigning a number to a spot,never assign a number that,at that moment,conflicts with the spot’s row,column,or square. We are up-front careful about assigning legal numbers to a spot,rather than assigning any number 1..9 and finding the problem later in the recursion. Assume that the initial grid is all legal,and make only legal spot assignments thereafter.
心理思想
我可以迭代地跟随一个小的输入.例如,说我必须未解决的单元格#1和单元#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!
递归回溯的一些很好的解释
> This answer to StackOverflow – Sudoku发生器的递归解决方案
> This answer到StackOverflow – 在迷宫中的BackTracking
> This answer到StackOverflow – 主序列的回溯算法
> This answer到StackOverflow – 如何找到第一个解决方案只有这个回溯
>维基百科文章Backtracking
> Recursive Backtracking Explanation
题
我之前已经进行了递归回溯,我已经看过上面的所有链接,我仍然有麻烦.我认为问题在于我如何解决这个问题. (参见Psudeocode Idea.)是否适合使用递归回溯进行详尽的搜索?追溯权是否正确执行错误?我可以使用比递归回溯更好的算法吗?先谢谢了!