【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;
};


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章