题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

// 用set去保存1-9个数字,再去每一列和每一行每个格子进行比对
// 相当于用空间去换时间
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
const arr = [];
void (async function () {
  // Write your code here
  while ((line = await readline())) {
    // 格式化数字
    arr.push(line.split(" ").map(Number));
  }
  const rows = new Array(9)
  const cols = new Array(9)
  const blocks = new Array(9)
  const options = [1, 2, 3, 4, 5, 6, 7, 8, 9];
  for (let i = 0; i < 9; i++) {
    rows[i] = new Set(options)
    cols[i] = new Set(options)
    blocks[i] = new Set(options)
  }
  // 计算当前处于第几个九宫格
  const getBlockIndex = (i, j) => (~~(i / 3)) * 3 + (~~(j / 3))
  for (let i = 0; i < 9; i++) {
    for (let j = 0; j < 9; j++) {
      if (arr[i][j] !== 0) {
        rows[i].delete(arr[i][j])
        cols[j].delete(arr[i][j])
        blocks[getBlockIndex(i, j)].delete(arr[i][j])
      }
    }
  }
  function dfs(row, col) {
    if (col === 9) {
      row++;
      col = 0;
    }
    if (row === 9) {
      // 填完了
      return true;
    }
    // 如果不是0就不需要补充去填
    if (arr[row][col] !== 0) return dfs(row, col + 1);
    const blockIndex = getBlockIndex(row, col)
    // 递归1-9去补充数字
    for (let n = 1; n <= 9; n++) {
      // 必须三个set里面都存在这个数字不然的话就是有冲突
      if (!rows[row].has(n) || !cols[col].has(n) || !blocks[blockIndex].has(n))
        continue;
      arr[row][col] = n;
      rows[row].delete(n)
      cols[col].delete(n)
      blocks[blockIndex].delete(n)
      if (dfs(row, col + 1)) return true;
      // 如果下一个格子不能正常填入就false
      //  那么就不能填这个数字了 然后把这个数字补回去到set中
      arr[row][col] = 0;
      rows[row].add(n)
      cols[col].add(n)
      blocks[blockIndex].add(n)
    }
    // 尝试了1-9都完不成就返回false
    return false;
  }
  dfs(0, 0);
  arr.forEach((e) => console.log(e.join(" ")));
})();

全部评论

相关推荐

07-09 15:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务