问题描述:
判断一个9X9的数独(可以有空缺)是否是有效的。只有当每一个单元格满足下列要求才算有效:
- 每行不重复地包含1-9
- 每列不重复地包含1-9
- 每个3X3的子框不重复地包含1-9
图例如下:
输入:
[
["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
输入:
[
["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
(因为第一列同时出现了8)
解题思路:
/*
桶排法:
将输入中非空的数字放入数组中,如果数字的出现的次数大于1,则该数独是无效的。
依次扫描数独的行和列,以及3X3子框
*/
c++代码实现:
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
int row[9][10] = {0};
int colum[9][10] = {0};
int box[3][3][10] = {0};
int value = 0;
for(int i = 0; i < 9; i++){
for(int j = 0; j < 9; j++){
if(board[i][j] != '.'){
value = board[i][j] - '0';
row[i][value] += 1;
colum[j][value] += 1;
box[i / 3][j / 3][value] += 1;
if(row[i][value] > 1 || colum[j][value] > 1 || box[i / 3][j / 3][value] > 1){
return false;
}
}
}
}
return true;
}
};
source link:valid-sudoku
Practice makes prtfect !