LeetCode - 37. 解数独(回溯法)

37. 解数独

在这里插入图片描述
在这里插入图片描述
和八皇后问题类似,横向、纵向、斜角问题判断

方法一:(回溯法)

class Solution {
    public void solveSudoku(char[][] board) {
        if (board == null || board.length == 0)
            return;
        solve(board);
    }

    private boolean solve(char[][] board) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == '.'){
                    //棋盘有空位的地方去填1-9
                    for (char c = '1'; c <= '9'; c++) {
                        //判断填进去的数字是否合法
                        if (isVaild(board,i,j,c)){
                            board[i][j] = c;    //填入这个数

                            if (solve(board))
                                return true;    //如果棋盘能解决的话,就说明问题解决了,return true
                            else
                                board[i][j] = '.';  //恢复上一个状态,回溯
                        }
                    }
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 判断棋盘的合法性
     * @param board
     * @param row
     * @param col
     * @param c
     * @return
     */
    private boolean isVaild(char[][] board, int row, int col, char c) {
        for (int i = 0; i < 9; i++) {
            if (board[i][col] != '.' && board[i][col] == c) return false;//检查行是否合法
            if (board[row][i] != '.' && board[row][i] == c) return false;//检查列是否合法
            if (board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] != '.' &&
                    board[3 * (row / 3) + i / 3][3 * (col / 3) + i % 3] == c) return false;//检查3*3的格子是否合法
        }
        return true;
    }
}

方法二:回溯+状态压缩
在这里插入图片描述

在这里插入图片描述

posted @ 2020-11-22 22:48  your_棒棒糖  阅读(60)  评论(0)    收藏  举报