LeetCode 36. Valid Sudoku【九宮格判斷合法】
阿新 • • 發佈:2018-12-15
Determine if a 9x9 Sudoku board is valid. Only the filled cells need to be validated according to the following rules:
- Each row must contain the digits
1-9
without repetition. - Each column must contain the digits
1-9
without repetition. - Each of the 9
3x3
sub-boxes of the grid must contain the digits1-9
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;
}
};