【发布时间】:2016-03-04 22:55:54
【问题描述】:
我在解决 leetcode 问题时遇到了这个问题 (https://leetcode.com/problems/sudoku-solver/)。
问题是这样的:
编写一个程序,通过填充空单元格来解决数独难题。
空单元格由字符“.”表示。
您可以假设只有一种独特的解决方案。
我的解决办法是
public class Solution {
public void solveSudoku(char[][] board) {
helper(board, 0, 0);
}
//recursion body
public boolean helper(char[][] board, int row, int col){
//In the two for loop, if I change i = row and j = col to i = 0 and j = 0
//respectively, the program returns the right answer.
for(int i = row; i < 9 ; ++i){
for(int j = col; j < 9; ++j){
if(board[i][j] == '.'){
for(char ch = '1'; ch <= '9'; ch++){
if(check(board, i, j, ch)){
board[i][j] = ch;
if(helper(board, i, j)){
return true;
}else{
board[i][j] = '.';
}
}
}
return false;
}
}
}
return true;
}
//check if the character to be filled is right.
public boolean check(char[][] board, int row, int col, char ch){
for(int i = 0; i < 9; ++i){
if(board[row][i] == ch){
return false;
}
if(board[i][col] == ch){
return false;
}
}
for(int i = row / 3 * 3; i < row / 3 * 3+ 3; ++i){
for(int j = col / 3 * 3; j < col / 3 * 3 + 3; ++j){
if(board[i][j] == ch){
return false;
}
}
}
return true;
}
}
那段代码没有通过 OJ,但是如果我将辅助函数中的前两个 for 循环更改为:
for(int i = 0; i < 9 ; ++i){
for(int j = 0; j < 9; ++j){
...
}
}
这行得通。我对此感到非常困惑。因为在 for 循环中,在 i 和 j 到达 row 和 col 之前,该函数实际上除了迭代值之外什么都不做。谁能告诉我为什么这会有所作为?
我阅读了很多关于递归的文章,但我仍然不确定问题所在,有人可以帮助我吗?
【问题讨论】:
-
进行一些调试以打印
i和j,以及您正在使用它们做什么。 -
好点,我做到了,发现了问题。谢谢。