36.有效的数独

2020-06-17
有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可
  • 数字 1-9 在每一行只能出现一次。
  • 数字 1-9 在每一列只能出现一次。
  • 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

上图是一个部分填充的有效的数独。

数独部分空格内已填入了数字,空白格用 '.' 表示。

说明
  • 一个有效的数独(部分已被填充)不一定是可解的。
  • 只需要根据以上规则,验证已经填入的数字是否有效即可。
  • 给定数独序列只包含数字 1-9 和字符 '.' 。
  • 给定数独永远是 9x9 形式的。
题解:
思路1:哈希表
var isValidSudoku = function (board) {
  let hash1 = new Array(9), // 3个hash表分别对应每一行 每一列 每一格
    hash2 = new Array(9), // 千万别用fill({}) fill出来的是同一个对象~~~~
    hash3 = new Array(9),
    tmp, i3; // tmp当前遍历项的值  i3 是hash3对应的第几个方格
  for (let i = 0; i < board.length; i++) {
    hash1[i] = {}; // i表示每一行 每次进入新的一行 hash1[i] 赋值为空对象
    for (let j = 0; j < board.length; j++) {
      if (i === 0) hash2[j] = {}; // 当 i = 0 时 hash2 每一列都没有赋值 为每一列赋值空对象
      tmp = board[i][j];
      if (tmp === '.') continue; // 空则继续

      if (!hash1[i][tmp]) hash1[i][tmp] = 1; // 如果第i行还没出现过这个值 赋值1
      else return false; // 如果出现过 说明一行出现两个相同值 return false

      if (!hash2[j][tmp]) hash2[j][tmp] = 1; // 如果第j列没出现过这个值 赋值1
      else return false; // 如果出现过 说明一列出现两个相同值 return false

      i3 = Math.floor(i / 3) * 3 + Math.floor(j / 3); // i3计算当前i j对应的是第几个小方格
      if (!hash3[i3]) hash3[i3] = {};
      if (!hash3[i3][tmp]) hash3[i3][tmp] = 1; // 如果当前方格没有出现过该值 赋值1
      else return false; // 同理
    }
  }
  return true; // 遍历结束后都没触发过return false 说明是有效的数独
};
 
原文地址:https://www.cnblogs.com/lanpang9661/p/13150804.html