数独求解器递归

时间:2016-03-04 22:55:54

标签: java recursion

我在解决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之前,该函数实际上除了迭代值之外什么都不做。有人能告诉我为什么会有所作为吗?

我读了很多关于递归的文章,但我仍然不确定这个问题,有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

我在两个for循环下打印i和j,发现问题是因为如果我每次都调用helper(i,j)。 j的值只能增加,不能减少。