【发布时间】:2014-03-21 00:00:36
【问题描述】:
最近我一直在尝试自学一些递归,以更好地理解这个过程。虽然我了解基本的递归技术,但我仍然对递归回溯的想法感到困惑。为了帮助解决这个问题,我尝试编写一种方法,在给定一个二维数组和两个整数 r 和 c 时求解数独求解器,它们用于表示当前列和行。
我相信我已经正确设置了所有东西,但我无法完全弄清楚如何处理“解开”,或者在我的初始方法调用达到最终的基本情况后会发生什么。
截至目前,当我运行这个方法时,它只返回一个空的板,(除非之前有一个值,在这种情况下它保持不变)。我觉得我在方法末尾的“board[r][c] = 0”可能与此有关。
“digitsValid”方法对应于检查以确保棋盘上的当前位置是行、列和 3x3 子网格内的有效移动的方法。
任何帮助将不胜感激。
private boolean sudokuSolver(int[][] board, int r, int c) {
if(c > 8) {
c = 0;
r = r + 1;
}
if(r > 8) {
return true;
}
if(board[r][c] != 0) {
sudokuSolver(board, r, c + 1);
} else {
for(int i = 1; i <= 9; i++) {
if(digitsValid(board, r, c)) {
board[r][c] = i;
if(sudokuSolver(board, r, c + 1)) {
return true;
}
}
}
}
board[r][c] = 0;
return false;
}
【问题讨论】:
-
首先进入递归方法的板子是什么样子的?