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.
这个题的难度在于找出board[i][j]位于哪个正方形
观察行号规律:
第0个九宫格:000111222; 第1个九宫格:000111222; 第2个九宫格:000111222;
第3个九宫格:333444555; 第4个九宫格:333444555; 第5个九宫格:333444555;
第6个九宫格:666777888; 第7个九宫格:666777888; 第8个九宫格:666777888;
可见对于每三个九宫格行号增3;对于单个九宫格,每三个格点行号增1。
因此第i个九宫格的第j个格点的行号可表示为i/3*3+j/3
观察列号规律:
第0个九宫格:012012012; 第1个九宫格:345345345; 第2个九宫格:678678678;
第3个九宫格:012012012; 第4个九宫格:345345345; 第5个九宫格:678678678;
第6个九宫格:012012012; 第7个九宫格:345345345; 第8个九宫格:678678678;
可见对于下个九宫格列号增3,循环周期为3;对于单个九宫格,每个格点行号增1,周期也为3。
周期的数学表示就是取模运算mod。
因此第i个九宫格的第j个格点的列号可表示为i%3*3+j%3
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int flag_1[9][9] = {0}, flag_2[9][9] = {0}, flag_3[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(flag_1[i][num] || flag_2[j][num] || flag_3[k][num])
return false;
flag_1[i][num] = flag_2[j][num] = flag_3[k][num] = 1;
*/
if (flag_1[i][num] == 0)
flag_1[i][num] = 1;
else
return false;
if (flag_2[j][num] == 0)
flag_2[j][num] = 1;
else
return false;
if (flag_3[k][num] == 0)
flag_3[k][num] = 1;
else
return false;
}
return true;
}
};