LeetCode: Sudoku Solver

来源:互联网 发布:全国彩票开奖数据接口 编辑:程序博客网 时间:2024/05/21 14:49

思路:(借助网上的讨论)因为题目输入保证有且只有一个解,所以试探每一个格子的时候,只需要考虑当前行、列、矩形框满足条件,满足就进入下一个格子试探,不满足回溯。

注意判断一个格子落入哪个矩形框的设计,前面一题采用了比较trivial的方法!-_-

code:

class Solution {public:    bool isValidSudoku(vector<vector<char> > &board,int row,int col){        for(int j=0;j<9;j++)            if(j != col && board[row][j] == board[row][col])                return false;            for(int i=0;i<9;i++)            if(i != row && board[i][col] == board[row][col])                return false;                int gridRow = row/3*3, gridCol = col/3*3;        for(int i=0;i<3;i++)            for(int j=0;j<3;j++)                    if(gridRow + i != row && gridCol + j != col && board[gridRow + i][gridCol + j] == board[row][col])                    return false;        return true;    }        bool solveSudokuSingle(vector<vector<char> > &board){        for(int i=0;i<9;i++)            for(int j=0;j<9;j++)                if(board[i][j] == '.'){                    for(int k=1;k<=9;k++){                        board[i][j] = '0' + k;                        if(isValidSudoku(board,i,j) && solveSudokuSingle(board))                             return true;                        board[i][j] = '.';                    }                     return false;                 }        return true;    }        void solveSudoku(vector<vector<char> > &board) {        solveSudokuSingle(board);    }};


0 0