题目:

请判定一个数独是否有效。
该数独可能只填充了部分数字,其中缺少的数字用 . 表示。

样例:

The following partially filed sudoku is valid.
clipboard.png

思路:

  • 什么是数独
    Each row must have the numbers 1-9 occuring just once.
    clipboard.png

    Each column must have the numbers 1-9 occuring just once.
    clipboard.png

    And the numbers 1-9 must occur just once in each of the 9 sub-boxes of the grid.
    clipboard.png

  • 数独的合法性
    只要当前已经填充的数字是合法的就可以,不一定要这个数独是有解的。
  • 所以,本题的思路就是使矩阵的每一行已有的数字不重复,每一列已有的数字不重复,每一个小九宫格的数字不重复。每次一个set来存储数字出现的状态。

参考答案:

class Solution {
public:
    /*
     * @param board: the board
     * @return: whether the Sudoku is valid
     */
    bool isValidSudoku(vector<vector<char>> &board) {
        // write your code here
        if(board.empty())   return false;
        
        for(int i=0; i<9; i++){//检查每一行
            map<char,bool> row;  //未初始化的bool值是false
            for(int j=0; j<9; j++){
                if(board[i][j] != '.'){ //遇到‘.’就忽略掉
                    if(row[board[i][j]] == true){
                        return false;
                    }
                    else{
                        row[board[i][j]] = true;
                    }
                }
            }
        }
        
        for(int i=0; i<9; i++){//检测每一列
            map<char,bool> col;
            for(int j=0; j<9; j++){
                if(board[j][i] != '.'){
                    if(col[board[j][i]] == true){
                        return false;
                    }
                    else{
                        col[board[j][i]] = true;
                    }
                }
            }
        }
        
        for(int i=0; i<9; i+=3){
            for(int j=0; j<9; j+=3){//检查每一个小块
                map<char, bool> block;
                for(int k=0; k<9; k++){
                    if(board[i+k/3][j+k%3] != '.'){
                        if(block[board[i+k/3][j+k%3]] == true){
                            return false;
                        }
                        else{
                        block[board[i+k/3][j+k%3]] = true;
                        }
                    }
                }
            }
        }
    return true;
    }
};

wydong
40 声望5 粉丝

wyd


引用和评论

0 条评论