请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
注意:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
空白格用 '.' 表示。
// 方法一
public boolean isValidSudoku(char[][] board) {
int[][] listRow = new int[9][9]; // 记录行数字
int[][] listCol = new int[9][9]; // 记录列数字
int[][][] listBlock = new int[3][3][9]; // 记录块数字
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char num = board[i][j];
if (num != '.') {
int numIndex = num - '0'-1; // 减1转换成下标
// 验证
listRow[i][numIndex] ++;
listCol[j][numIndex] ++;
listBlock[i/3][j/3][numIndex] ++;
if (listRow[i][numIndex] > 1 || listCol[j][numIndex] >1 || listBlock[i/3][j/3][numIndex] >1) {
return false;
}
}
}
}
return true;
}
// 方法二
public boolean isValidSudoku(char[][] board) {
int [][]row =new int[9][10]; // 存储行数字 new 10 不用转换下标了
int [][]col =new int[9][10];
int [][]box =new int[9][10];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j]=='.'){
continue;
}
int curNum = board[i][j]-'0'; // 没有减1 转换下标
if (row[i][curNum]==1){
return false;
}if (col[j][curNum]==1){
return false;
}
// (i/3) * 3 每隔3行
if (box[j/3 + (i/3) * 3][curNum]==1){
return false;
}
row[i][curNum]=1;
col[j][curNum]=1;
box[j/3 + (i/3) * 3][curNum]=1;
}
}
return true;
}
总结
3维数组 构成了一个立方体结构,如同常见的玩具魔方一样,相对于2维,就多了一个层的概念
int SanWei[][][]={{{5,2,3},{4,5,6}},{{87,7,5},{10,11,12}}};
第一层int SanWei[0][*][*] 是一个二维数组如下
int SanWei[0][0][*] :{5,2,3} int SanWei[0][1][*] :{4,5,6}
第二层int SanWei[1][*][*] 是一个二维数组如下
int SanWei[1][0][*] :{87,7,5} int SanWei[1][1][*] :{10,11,12}
(i/3) * 3 可以表示每三行 分割一个块