分类:algorithm| 发布时间:2016-09-27 15:23:00
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可 Sudoku Puzzles - The Rules。
上图是一个部分填充的有效的数独。
数独部分空格内已填入了数字,空白格用 '.' 表示。
示例 1:
输入:
[
["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"]
]
输出: true
示例 2:
输入:
[
["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"]
]
输出: false
解释: 除了第一行的第一个数字从 5 改为 8 以外,空格内其他数字均与 示例1 相同。
但由于位于左上角的 3x3 宫内有两个 8 存在, 因此这个数独是无效的。
说明:
解法相当简单,只需要根据规则判断每行,每列以及每块是否有重复的数字即可。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int col[9][9] = {0}, row[9][9] = {0}, rec[9][9] = {0};
for(int i = 0; i < 9; ++ i) {
for(int j = 0; j < 9; ++ j) {
if(board[i][j] != '.') {
int num = board[i][j] - '0' - 1, k = i / 3 * 3 + j / 3;
if(col[i][num] || row[j][num] || rec[k][num])
return false;
col[i][num] = row[j][num] = rec[k][num] = 1;
}
}
}
return true;
}
};