[Leetcode]_37 Sudoku Solver

来源:互联网 发布:婚纱摄影 知乎 编辑:程序博客网 时间:2024/06/03 16:20
/** *  Index: 37 *  Title: Sudoku Solver *  Author: ltree98 **/



刚刚做了一个检查数独是否合法。
这次,就是来解这个数独了。
用的最简单最暴力的办法 —— 回溯

  • 遍历数独,从左至右,从上到下的顺序
    • 遇到数字,过
    • 遇到非数字,开始准备填数
      • 从1-9开始填(判断填上去是否合规则)
        • 有合规则的,继续向后遍历
        • 如果没有合规则的,说明前面有填错的,回到上一层向下重填


class Solution {private:    bool isLegal(vector<vector<char>>& board, int row, int col, char number)    {        int s = row/3*3 + col/3;        for(int i = 0; i < 9; i++)            if(board[i][col] == number)                return false;        for(int j = 0; j < 9; j++)            if(board[row][j] == number)                return false;        int sR = row - row%3, sC = col - col%3;        for(int i = 0; i < 3; i++)            for(int j = 0;j < 3; j++)                if(board[sR+i][sC+j] == number)                    return false;        return true;    }    bool traversalSudoku(vector<vector<char>>& board, int row, int col) {        if(col > 8) {            ++row;            col = 0;        }        if(row > 8)             return true;        if(board[row][col] == '.')  {            for(char num = '1'; num <= '9'; num++)   {                if(isLegal(board, row, col, num))   {                    board[row][col] = num;                    if(traversalSudoku(board, row, col+1))    {                        return true;                    }                    board[row][col] = '.';                }            }            return false;        }        return traversalSudoku(board, row, col+1);    }public:    void solveSudoku(vector<vector<char>>& board) {        traversalSudoku(board, 0, 0);    }};
原创粉丝点击