最近喜欢上数独游戏。于是就在leetcode找了一下相关算法。怎么检查一个有效数独呢!
一、 哈希判重
-
当前行9个数字不能有重复数字
-
当前列9个数字不能有重复数字
-
九宫格 9个数字不能有重复数字
- 9*9的数独划分为9个小的子数独
let boxIndex = parseInt((i/3)) * 3 + parseInt(j/3); //子数独(宫)序号
**行标决定一组block的起始位置
(因为block为3行,所以除3取整得到组号,又因为每组block为3个,所以需要乘3) ,
列标再细分出是哪个block(因为block是3列,所以除3取整)**
javascript 例子
i 代表行
j 代表列
var sd = new solveSudoku([
["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"]
]);
/**
* @param {character[][]} board
* @return {boolean}
*/
var isValidSudoku = function(board) {
// 三个方向判重
let rows = {}; //行
let columns = {};//列
let boxes = {};//子数独
// 遍历数独 行
for(let i = 0;i < 9;i++){
//遍历数独 列
for(let j = 0;j < 9;j++){
//遍历数独 获取数独
let num = board[i][j];
//.代表空数据
if(num != '.'){
// 获取子数独序号
let boxIndex = parseInt((i/3)) * 3 + parseInt(j/3);
console.log(boxIndex+'-'+num);
if(rows[i+'-'+num] || columns[j+'-'+num] || boxes[boxIndex+'-'+num]){
console.log(false);
return false;
}
// 以各自方向 + 不能出现重复的数字 组成唯一键值,若出现第二次,即为重复
rows[i+'-'+num] = true;
columns[j+'-'+num] = true;
boxes[boxIndex+'-'+num] = true;
}
}
}
console.log(true);
return true;
};