37. 解数独


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sudoku-solver
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


注意几点:
1, 需要加返回值,我为什么呢?要区分回溯的状态,是已经填充完毕的回溯返回还是下一个值无法填写的回溯。

    // 就是[1,9]挨着试,不冲突,下一个格;冲突,试下一个数,都冲突,回溯到上一层。
    public void solveSudoku(char[][] board) {

        dfs(board);

    }

    public boolean dfs(char[][] board) {
        for(int i=0;i<board.length;i++) {
            for(int j=0;j<board.length;j++) {
                if(board[i][j] != '.') {
                    continue;
                }
                // 填值
                for(char t='1';t<='9';t++) {

                    if(checkRow(board,i,t) && checkCol(board,j,t) && checkSubBoard(board,i,j,t)) {
                        board[i][j] = t;
                        boolean ret = dfs(board);
                        if(ret) {
                            return true;
                        }
                       
                    }

                }

                // 到这步说明所有值都不行
                board[i][j] = '.';
                return false;

            }
        }
        return true;
    }

    public boolean checkRow(char[][] board, int row, char c) {
        for(int i=0;i<board.length;i++) {
            if(board[row][i] == c) {
                return false;
            }
        }
        return true;
    }

    public boolean checkCol(char[][] board, int col, char c) {
        for(int i=0;i<board.length;i++) {
            if(board[i][col] == c) {
                return false;
            }
        }
        return true;
    }

    public boolean checkSubBoard(char[][] board, int row, int col, char c) {

        int subRow = (row/3)*3;
        int subCol = (col/3)*3;

        for(int i= subRow; i<subRow+3; i++) {
            for(int j=subCol;j<subCol+3;j++) {
                if(board[i][j] == c) {
                    return false;
                }
            }
        }
        return true;
    }
posted @ 2022-02-28 20:38  一颗青菜  阅读(2)  评论(0)    收藏  举报