Problem
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 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 ‘.’.
4.The given board size is always 9x9.
解题思路
直接求解就好。
代码如下:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
bool flag = true;
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
flag = flag && check_3x3_block(board, i * 3, j * 3);
if (!flag)
{
return flag;
}
}
}
for (int i = 0; i < 9; ++i)
{
flag = flag && check_vertical(board, i);
if (!flag)
{
return flag;
}
}
for (int i = 0; i < 9; ++i)
{
flag = flag && check_horizontal(board, i);
if (!flag)
{
return flag;
}
}
return flag;
}
bool check_3x3_block(const vector<vector<char>>& board, const int i, const int j)
{
set<char> visited;
for (size_t ii = 0; ii < 3; ++ii)
{
for (size_t jj = 0; jj < 3; ++jj)
{
if (board[i + ii][j + jj] != '.' && visited.find(board[i + ii][j + jj]) != visited.end())
{
return false;
}
visited.insert(board[i + ii][j + jj]);
}
}
return true;
}
bool check_vertical(const vector<vector<char>>& board, const int i)
{
set<char> visited;
for (size_t ii = 0; ii < 9; ++ii)
{
if (board[ii][i] != '.' && visited.find(board[ii][i]) != visited.end())
{
return false;
}
visited.insert(board[ii][i]);
}
return true;
}
bool check_horizontal(const vector<vector<char>>& board, const int i)
{
set<char> visited;
for (size_t ii = 0; ii < 9; ++ii)
{
if (board[i][ii] != '.' && visited.find(board[i][ii]) != visited.end())
{
return false;
}
visited.insert(board[i][ii]);
}
return true;
}
};