【leetcode】 36. 有效的数独

最近喜欢上数独游戏。于是就在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;
};


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36851500/article/details/103948675