1. 程式人生 > >LeetCode 36. Valid Sudoku【九宮格判斷合法】

LeetCode 36. Valid Sudoku【九宮格判斷合法】

Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:

  1. Each row must contain the digits 1-9 without repetition.
  2. Each column must contain the digits 1-9 without repetition.
  3. Each of the 9 3x3 sub-boxes of the grid must contain the digits 1-9
     without repetition.

A partially filled sudoku which is valid.

The Sudoku board could be partially filled, where empty cells are filled with the character '.'.

Example 1:

Input:
[
  ["5","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output:
true

Example 2:

Input:
[
  ["8","3",".",".","7",".",".",".","."],
  ["6",".",".","1","9","5",".",".","."],
  [".","9","8",".",".",".",".","6","."],
  ["8",".",".",".","6",".",".",".","3"],
  ["4",".",".","8",".","3",".",".","1"],
  ["7",".",".",".","2",".",".",".","6"],
  [".","6",".",".",".",".","2","8","."],
  [".",".",".","4","1","9",".",".","5"],
  [".",".",".",".","8",".",".","7","9"]
]
Output:
false Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.

Note:

  • A Sudoku board (partially filled) could be valid but is not necessarily solvable.
  • Only the filled cells need to be validated according to the mentioned rules.
  • The given board contain only digits 1-9 and the character '.'.
  • The given board size is always 9x9.

開始以為除了滿足三條限制還要有引申的限制

發現並不用

要不是犯了SB錯誤 早就A了

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        for(int i=0;i<9;i++){
            int fl1[11]={0},fl2[11]={0};
            for(int j=0;j<9;j++){
                if(board[i][j]!='.'){
                    if(fl1[board[i][j]-'0']==1)
                        return false;
                    else
                        fl1[board[i][j]-'0']=1;
                }
                if(board[j][i]!='.'){
                    if(fl2[board[j][i]-'0']==1)
                        return false;
                    else
                        fl2[board[j][i]-'0']=1;
                }  
            }
        }
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                int fl[10]={0};
                for(int k=0;k<3;k++){
                    for(int q=0;q<3;q++){
                        if(board[k+i*3][q+j*3]!='.'){
                            if(fl[board[k+i*3][q+j*3]-'0'])
                                return false;
                            else
                                fl[board[k+i*3][q+j*3]-'0']=1;
                        }
                    }
                }
            }
        }
        return true;
    }
};

也可以一起寫 用map存  討論帖的unorder_map沒看懂

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        int n = board.size();
        vector<map<char, int>>row(n);
        vector<map<char, int>>col(n);
        vector<vector<map<char, int>>>sub(n/3, vector<map<char, int>>(n/3));
        for(int i = 0; i < n; i++)
            for(int j = 0; j < n; j++){
                char c = board[i][j];
                if(c == '.') continue;
                if(row[i][c]++ > 0 || col[j][c]++ > 0 || sub[i/3][j/3][c]++ > 0) return false;
            }
        return true;
    }
};