LeetCode: 36. Valid Sudoku
题目描述
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules.
The Sudoku board could be partially filled, where empty cells are filled with the character ‘.’.
A partially filled sudoku which is valid.
Note:
A valid Sudoku board (partially filled) is not necessarily solvable. Only the filled cells need to be validated.
大意是说: 判断给定的矩阵是否满足每行、每列、每个3*3的小矩阵中没有重复的数字(1-9)。
解题思路
只需要用一个hash表记录每行每列每个小矩阵中出现过的 1-9即可。这里我用一个 int 的0-8位的值来表示数字1-9是否出现过, 当数字i出现时, 就将第i-1位标记为1。
AC源码
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row[9] = {0};
int column[9] = {0};
int rect[9] = {0};
for(int i = 0; i < board.size(); ++i)
{
for(int j = 0; j < board[i].size(); ++j){
if(board[i][j] != '.')
{
int value = 1 << (board[i][j] - '0' - 1);
if(row[i] & value) return false;
else row[i] |= value;
if(column[j] & value) return false;
else column[j] |= value;
int rectIdx = i/3*3 + j/3;
if(rect[rectIdx]&value) return false;
else rect[rectIdx] |= value;
}
}
}
return true;
}
};