题目描述:
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
image.png
用二维数组表示为:
[["5","3",".",".","7",".",".",".","."],
["6",".",".","1","9","5",".",".","."],
[".","9","8",".",".",".",".","6","."],
["8",".",".",".","6",".",".",".","3"],
["4",".",".","8",".","3",".",".","1"],
["7",".",".",".","2",".",".",".","6"],
[".","6",".",".",".",".","2","8","."],
[".",".",".","4","1","9",".",".","5"],
[".",".",".",".","8",".",".","7","9"]]
说明:
一个有效的数独(部分已被填充)不一定是可解的。
只需要根据以上规则,验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 '.' 。
给定数独永远是 9x9 形式的。
示例:
如果将第一行第一列中的5改为8,则是一个无效的数独(第一列中存在相同的数字8),期望结果为false,为有效的数独结果为true。
解题思路:
1.遍历给出的数独,将每个不为“.”的元素所在的行、列、3*3小格对应的数字分别存放在rows、cols、boxs三个数组中;
2.利用set将步骤1得到的数组去重,分别保存在newRowArr、newColArr、newBoxsArr中,与没有去重的数组进行长度比较;
3.长度全部相等,为有效数独,返回true;存在一组长度比较值不相等,则为无效数独,返回false;
重点:
如何将9 * 9 共81个数字,按照数独的规则分成 3 * 3 为一个小格,即1个数组包含3 * 3小格里面有值的数字。

我们希望数组里层循环的顺序为:
board[0][0] board[0][1] board[0][2]
board[1][0] board[1][1] board[1][2]
board[2][0] board[2][1] board[2][2]
board[0][3] board[0][4] board[0][5]
board[1][3] board[1][4] board[1][5]
board[2][3] board[2][4] board[2][5]
board[0][6] board[0][7] board[0][8]
board[1][6] board[1][7] board[1][8]
board[2][6] board[2][7] board[2][8]
核心代码:
求3 * 3 小格组成的数组时,计算正确的索引值。
let rowIndex = Math.floor(i / 3) * 3 + Math.floor(j / 3);
let colIndex = Math.floor(i % 3) * 3 + Math.floor(j % 3);
完整代码实现:
let isValidSudoku = function(board) {
let rows = [];
let cols = [];
let boxs = [];
let result = true;
for (let i = 0; i < 9; i++) {
rows = [];
cols = [];
boxs = getBox(board, i);
for (let j = 0; j < 9; j++) {
if (board[i][j] != '.') {
rows.push(board[i][j]);
}
if (board[j][i] != '.') {
cols.push(board[j][i]);
}
}
let newRowArr = [...new Set(rows)];
let newColArr = [...new Set(cols)];
let newBoxsArr = [...new Set(boxs)];
if (newRowArr.length !== rows.length || newColArr.length !== cols.length || newBoxsArr.length !== boxs.length) {
return false;
}
}
return result;
};
// 获取3*3小格子的数组元素
let getBox = function (board, index) {
let boxs = [];
for (let i = 0; i < 9; i++){
boxs[i] = [];
for (let j = 0; j < 9; j++) {
let rowIndex = Math.floor(i / 3) * 3 + Math.floor(j / 3);
let colIndex = Math.floor(i % 3) * 3 + Math.floor(j % 3);
if (board[rowIndex][colIndex] != '.') {
boxs[i].push(board[rowIndex][colIndex]);
}
}
}
return boxs[index];
};
网友评论