36. 有效的数独
请你判断一个 9x9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.'
表示。
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
示例 1:
输入:board =
[["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:
输入:board =
[["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 存在, 因此这个数独是无效的。
提示:
board.length == 9
board[i].length == 9
board[i][j]
是一位数字或者'.'
class Solution {
public boolean isValidSudoku(char[][] board) {
int[] result = new int[9];
int temp;
// 出现的主要点位是(0,0),(3,1),(6,2),(1,3),(4,4),(7,5),(2,6),(5,7),(8,8)
for (int x = 0, y = 0; x < 9 && y < 9; x = (x + 3) % 9 + (x + 3) / 9, ++y) {
// 验证横线
for(int m = 0; m < 9; ++m){
if(board[y][m] == '.'){
continue;
}
temp = board[y][m] - '1';
// 说明之前已经加过了,即出现了重复
if(result[temp] > 0){
return false;
}
result[temp]++;
}
// 能走出验证横线的循环说明横线没有问题,接下来刷新result数组,重新验证竖线
for(int i = 0; i < 9; ++i){
result[i] = 0;
}
for(int m = 0; m < 9; ++m){
if(board[m][x] == '.'){
continue;
}
temp = board[m][x] - '1';
if(result[temp] > 0){
return false;
}
result[temp]++;
}
// 能走出竖线的循环说明竖线没有问题,接下来刷新result数组,重新验证九宫格
for(int i = 0; i < 9; ++i){
result[i] = 0;
}
for(int m = 0; m < 3; ++m){
for(int n = 0; n < 3; ++n){
if(board[y + m - (x / 3)][x + n - (y / 3)] == '.'){
continue;
}
temp = board[y + m - (x / 3)][x + n - (y / 3)] - '1';
if(result[temp] > 0){
return false;
}
result[temp]++;
}
}
// 能走出九宫格循环说明九宫格没有问题,接下来验证下一个定点,刷新result
for(int i = 0; i < 9; ++i){
result[i] = 0;
}
}
return true;
}
}