请你判断一个 9x9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
- 数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
注意:
- 一个有效的数独(部分已被填充)不一定是可解的。
- 只需要根据以上规则,验证已经填入的数字是否有效即可。
思路:
- ◇ 刚开始因为看错题目,误以为要把整个数独解出来,所以当时懵了很久,后来仔细一看原来只需要验证,那就很简单了,这里用了最简单的方法,依次记录当前行列和小三角矩阵中出现的数字。
- ◇ 因为数独刚好是 9 * 9 的,且 其内部的小三角形也刚好是 9 个, 每个小矩阵中的数字也刚好是 9 个。用 3 个 9 * 9 的矩阵就可以记录当前数独矩阵中每行、每列以及每个小三角形矩阵中出现的数字。
- ◇ 例如 :
- row [i] [j] 表示 原数独矩阵 第 i 行 是否 有 j 这个数;
- column [i] [j] 表示 原数独矩阵 第 i 列 是否 有 j 这个数;
- cell : [i] [j] 表示 原数独矩阵 第 i 个小三角矩阵(从左往右,从上往下) 是否 有 j 这个数;
- ◇ 如果有这个数:即上述值中有一个为 1,直接返回 false。
function isValidSudoku(board: string[][]): boolean {
if(!board.length)
return false;
var length = board.length;
var row:number[][] = [[]];
for (let i = 0; i < length; ++i) {
row.push([]);
for (let j = 0; j < length; ++j) {
row[i].push(0);
}
}
var column:number[][] = [[]];
for (let i = 0; i < length; ++i) {
column.push([]);
for (let j = 0; j < length; ++j) {
column[i].push(0);
}
}
var cell:number[][] = [[]];
for (let i = 0; i < length; ++i) {
cell.push([]);
for (let j = 0; j < length; ++j) {
cell[i].push(0);
}
}
for (let i = 0; i < length; ++i) {
for (let j = 0; j < length; ++j) {
if (board[i][j] == '.')
continue;
let num = Number(board[i][j]) - 1;
let k = Math.floor(i / 3) * 3 + Math.floor(j / 3);
if (row[i][num] != 0 || column[j][num] != 0 || cell[k][num] != 0)
return false;
row[i][num] = column[j][num] = cell[k][num] = 1;
}
}
return true;
};
![在这里插入图片描述](https://img-blog.csdnimg.cn/c9a62d7b5e4a481c83cee72b8604a9cf.png)