leecode---37---多维数组,dfs---解决一个数独问题

遍历每行
遍历每列
找到一个位置,如果是个空的,就遍历1到九。
写一个函数,判断当前位置如果放了个数字后是否是合理的,所以这个函数是放在if判断里面的,就是如果这个数放这里可以,那么接下去处理。判断方式就是遍历行后遍历列,同时遍历小方框九个参数,如果有相同的返回false。
如果这个位置放了某个数字可以,那么接下去dfs。

 
题意
给一个二维数组,没填写的地方是‘。’,然后解决这个数独问题。
 
分析
dfs函数
 
代码
class Solution {
    public void solveSudoku(char[][] board) {
        if (board == null || board.length != 9 || board[0].length != 9) return ;
        dfs(board);
    }
    
    //1.带有回溯的,因为不是求组合数量,而是求正确与否。
    //2.选择条件是把九个数字放进去试试,不行回滚回来。
    public boolean dfs(char[][] board) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                
                //两层循环处理每个节点,如果这个节点是个要填数的地方就使用数字去填写他。
                if (board[i][j] == '.') {
                    //试试九个数字,每个数字都试一次
                    for (char num='1';num <= '9';num++) {
                         if (isValid(board,i,j,num)) {//如果当前这个点放进去有效果
                             board[i][j] = num;
                             if(dfs(board))return true;
                             else board[i][j] = '.';//否则就回退将那个位置设置成'.'
                         }   
                    }
                    //最后如果九个数字都试过去了还是错误的那么返回false,说明本身这个数组有重复的错误。
                    return false;
                }
                
            }
        }
        
        //找了每一个点都看过了说明已经填好了
        return true;
    }
    
    //判断在i,j坐标点处放上一个c是否能够成立。成立的话就继续
    public boolean isValid(char[][] board,int i,int j,char c) {
        //行判断
        for (int col=0;col < 9;col++) {
            if (board[i][col] == c) return false;
        }
        for (int row = 0; row < 9;row++) {
            if (board[row][j] == c) return false;
        }
        for (int row=i/3*3;row<i/3*3+3;row++){
            for (int col = j/3*3;col < j/3*3+3;col++) {
                if (board[row][col]==c)return false;
            }
        }
        return true;
    }
    
}
posted @ 2018-05-03 15:17  buptyuhanwen  阅读(467)  评论(0编辑  收藏  举报