有效数独
题目:
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
without repetition.
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
.
解法:使用hashmap来判断,是否有重复数字
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int ix[] = {0,-1,1,0,0,-1,1,-1,1};
int iy[] = {0,0,0,-1,1,-1,-1,1,1};
int n = 9;
for(int i = 0; i < n; i++)
{
unordered_map<char,bool> row;
unordered_map<char,bool> col;
for(int j = 0; j < n; j++)
{
unordered_map<int,bool> grid3;
if(board[i][j] != '.'){
if(row[board[i][j]] == true)
return false;
else
row[board[i][j]] = true;
}
if(board[j][i] != '.'){
if(col[board[j][i]] == true)
return false;
else
col[board[j][i]] = true;
}
if(i%3 == 1 && j%3 == 1){
for(int k = 0; k < 9; k++)
{
int nx = i + ix[k], ny = j + iy[k];
if(nx >= 0 && nx < 9 && ny >= 0 && ny < 9)
{
if(board[nx][ny] != '.')
{
if(grid3[board[nx][ny]] == true)
return false;
else
grid3[board[nx][ny]] = true;
}
}
}
}
}
}
return true;
}
};
上面的代码简化如下:
class Solution
{
public:
bool isValidSudoku(vector<vector<char> > &board)
{
int used1[9][9] = {0}, used2[9][9] = {0}, used3[9][9] = {0};
for(int i = 0; i < board.size(); ++ i)
for(int j = 0; j < board[i].size(); ++ j)
if(board[i][j] != '.')
{
int num = board[i][j] - '0' - 1, k = i / 3 * 3 + j / 3;
if(used1[i][num] || used2[j][num] || used3[k][num])
return false;
used1[i][num] = used2[j][num] = used3[k][num] = 1;
}
return true;
}
};