(一)题目描述
请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 '.' 表示。
(二)解题思路
设置三个二维数组,分别判断行列以及每一个小模块是否有重复(
index=i/3*3+j/3:判断每一个Board属于哪一个小模块,可以自己罗列一下i、j以及其对应的模块,就能发现规律并推导出该公式)
(三)代码如下:
class Solution12 {
public boolean isValidSudoku(char[][] board) {
//用三个二维数组,记录每种情况下,各个条件是否满足
int[][] row = new int[9][9];
int[][] col=new int[9][9];
int[][] sBox=new int[9][9];
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if(board[i][j]!='.'){
int num=board[i][j]-'1';
int index=i/3*3+j/3;
//同一行出现了重复元素,则row[i][num]必定>=1
if(row[i][num]==1){
//说明在第i行中board曾经出现过(出现的次数大于2次),也保证了只判断同一行
return false;
}else{
row[i][num]=1;
}
//同一列时,j必相同,则col[num][j]必定>=1(因列数相同,则i相同)(此处必须细想,只可意会,不可言传)
//j为0-9一直在循环,以j作为横坐标,当一列出现重复元素时,第j列中的某个数的值肯定>=1
if(col[j][num]==1){
//说明在第j列中board曾经出现过(出现的次数大于2次),也保证了只判断同一行
return false;
}else{
col[j][num]=1;
}
if(sBox[index][num]==1){
//说明在第i*3/3+j/3个board小方块中曾经出现过(出现的次数大于2次),也保证了只判断同一行
return false;
}else{
sBox[index][num]=1;
}
}
}
}
return true;
}
}