我在解决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,但如果我将helper函数中的前两个for循环更改为:
for(int i = 0; i < 9 ; ++i){
for(int j = 0; j < 9; ++j){
...
}
}
有效。我真的很困惑。因为在for循环中,在i和j来到row和col之前,该函数实际上除了迭代值之外什么都不做。有人能告诉我为什么会有所作为吗?
我读了很多关于递归的文章,但我仍然不确定这个问题,有人能帮助我吗?
答案 0 :(得分:1)
我在两个for循环下打印i和j,发现问题是因为如果我每次都调用helper(i,j)。 j的值只能增加,不能减少。