美文网首页
有效的数独

有效的数独

作者: 是小张啊啊 | 来源:发表于2020-09-16 15:32 被阅读0次

题目描述:

判断一个 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小格里面有值的数字。

如图所示: image.png

我们希望数组里层循环的顺序为:

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

相关文章

  • leecode刷题(9)-- 有效的数独

    leecode刷题(9)-- 有效的数独 有效的数独 描述: 判断一个 9x9 的数独是否有效。只需要根据以下规则...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

  • 有效的数独

    给定一个9*9数组 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 ...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

  • 有效的数独

    题目描述: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在...

  • 有效的数独

    有效的数独 的题目是: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

  • 有效的数独

    判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能...

网友评论

      本文标题:有效的数独

      本文链接:https://www.haomeiwen.com/subject/bzacyktx.html