题目描述:
请你判断一个 9 x 9
的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字
1-9
在每一行只能出现一次。 - 数字
1-9
在每一列只能出现一次。 - 数字
1-9
在每一个以粗实线分隔的3x3
宫内只能出现一次。
解题思路:
一个有效的9x9数独需要满足三个条件,数字1-9在每行、每列、每个九宫格中只能出现一次;因此,只需要判断每一个数字在所在的行、所在的列、所在的个九宫格中出现的次数,就可以判断一个数独是否有效。
具体做法是:创建二维数组rows和columns用于记录一个数字在每行或每列的出现次数,其中横坐标表示数字所在的行或列,纵坐标表示待验证的数字,数组元素表示待验证数字出现的次数;9x9的数独可以分为一个3x3的大九宫格,创建一个三维数组nineSequareGrids[i][j][k]用于记录待验证数字在小九宫格中出现的次数,其中i、j表示小九宫格的位置,k表示待验证数字,数组元素表示待验证数字出现的次数。初始时,数组rows、columns、nineSequareGrids的初值均为0,遍历数独,如果每次验证时,数组元素不为零,则说明该数字在所在的行、所在的列、所在的小九宫格中已经出现,数独无效;如果每次验证时,数组元素均为0,则说明该数字在它所在的行、所在的列、所在的九宫格只出现了一次,数独有效。
public boolean isValidSudoku(char[][] board) {
//rows[i][j]:表示第i行中数字j出现了rows[i][j]
int[][] rows=new int[9][9];
//cols[i][j]:表示第i列中数字j出现了rows[i][j]
int[][] columns=new int[9][9];
//nineSequareGrids[i][j][k]:表示第i行,j列的九宫格中数字k出现了rows[i][j][k]次
int[][][] nineSequareGrids=new int[3][3][9];
for(int i=0;i<9;i++){
for (int j = 0; j < 9; j++) {
if(board[i][j]!='.'){
int num=board[i][j]-'1';
//验证行:
if (rows[i][num]==0) {
//数组元素为零,则说明给数字在所在的行第一次出现,数字出现次数+1
rows[i][num]++;
}else {
//数组元素不为零,则说明该数字在所在的行重复出现,数独无效
return false;
}
//验证列:
if (columns[j][num]==0) {
//数组元素为零,则说明给数字在所在的列第一次出现,数字出现次数+1
columns[j][num]++;
}else {
//数组元素不为零,则说明该数字在所在的列重复出现,数独无效
return false;
}
//验证九宫格:
if (nineSequareGrids[i/3][j/3][num]==0) {
//数组元素为零,则说明给数字在所在的九宫格第一次出现,数字出现次数+1
nineSequareGrids[i/3][j/3][num]++;
}else {
//数组元素不为零,则说明该数字在所在的九宫格重复出现,数独无效
return false;
}
}
}
}
return true;
}