解题思路:
该题通过哈希表(数组)计数来解决,因为题中矩阵的长度和维度都是9
定义二维数组rows,columns和三维度数组subboxes来对矩阵中第i行第j列数字在行、列和九宫格中出现的次数。
如果是一个有效的数独,那么矩阵中某个格子中的数字出现的次数在以上数组中对应的位置应该为1,如果超过1,则证明这个矩阵不是一个有效的数独。
行:rows[i][index]中i表示这是第几行,index即矩阵中第i行第j列单元格中数字-1(因为1<=数<=9,而索引0<=index<=8),rows[i][index]它表示这是第i行第index+1个数在矩阵中第i行出现的次数。
列:columns[j][index]中j表示这是第几列,index即矩阵中第i行第j列单元格中数字-1,columns[j][index]它表示这是第j列第index+1个数在矩阵中第j列出现的次数。
九宫格:subboxes[i / 3][j / 3][index]通过i/3和j/3来确定矩阵中某个九宫格的位置,index表示第i行第j列的数-1,subboxes[i / 3][j / 3][index]表示九宫格中第i行第j列的数在矩阵中第个九宫格出现的次数。
代码实现:
//行计数
int[][] rows = new int[9][9];
//列计数
int[][] columns = new int[9][9];
//九宫格计数
int[][][] subboxes = new int[3][3][9];
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c != '.') {
int index = c - '0' - 1;
//计数
rows[i][index]++;
columns[j][index]++;
subboxes[i / 3][j / 3][index]++;
//判断是不是有效的数独
if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
return false;
}
}
}
}
return true;
}