LeetCode: Sudoku Solver

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

注意判断一个格子落入哪个矩形框的设计,前面一题采用了比较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);
    }
};


你可能感兴趣的:(LeetCode: Sudoku Solver)