37.sudoku-solver

     这道题是数独游戏,规则我们很清楚,小时候一般小孩都玩过,所以,题目大体意思比较好懂。

     题目大意:给定一个9*9的二位数组,与数字和"."组成,按照数独游戏规则,在"."处填入数字,使得整个矩阵的每一行都是由1~9组成且没有重复,每一列由1~9组成且没有重复,9*9的矩阵可以分成9个3*3的二位小矩阵,而9个3*3的矩阵中,每个都是由1~9这9个数字组成,且没有重复。

      题目要求只写出一种可行的情况即可,那就只要有一种满足条件,就可以返回相应的值,而在数独游戏过程中,后续操作要依赖于前面步骤,所以,是典型的dfs思想题目。基本思想是遇到空白位置,从1~9依次尝试,每尝试一次要判断数组是否符合要求,如果符合要求,就向下一位置探索,如果不符合要求,就换下一个数字,如果都不符合,就向前回溯,直到所有空白都被填充。

以下是AC的代码,思想相对比较简单,适合新手阅读:

class Solution {
public:
    void solveSudoku(vector<vector<char>>& board) {
        solveSudoku1(board);
    }
    
private:
     bool solveSudoku1(vector<vector<char>>& board) {
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[0].size(); ++j) {
                if (board[i][j] == '.') {
                    for (int k=0; k<9; ++k) {
                        board[i][j] = k+'1';
                        if (isvalidSudoku(board, i, j)) {
                            if (solveSudoku1(board)) {
                                return 1;
                            }
                        }
                        board[i][j] = '.';
                    }
                    return 0;
                }
            }
        }
        return 1;
    }
    
    bool isvalidSudoku(vector<vector<char>>& board, int row, int col) {
        for (int i=0; i<9; ++i) {
            if (i!=row && board[i][col]==board[row][col]) {
                return 0;
            }
        }
        
        for (int j=0; j<9; ++j) {
            if (j!=col && board[row][j]==board[row][col]) {
                return 0;
            }
        }
        
        int rstart = (row/3)*3, cstart = (col/3)*3;
        for (int i=0; i<3; ++i) {
            for (int j=0; j<3; ++j) {
                if (rstart+i != row && cstart+j != col && board[rstart+i][cstart+j]==board[row][col]) {
                    return 0;
                }
            }
        }
        return 1;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_29592167/article/details/83107703