1. 首页

LeetCode 037. 解数独

题目描述:

难度:Hard

相关话题:哈希表回溯算法

编写一个程序,通过已填充的空格来解决数独问题。

一个数独的解法需遵循如下规则

  1. 数字 1-9 在每一行只能出现一次。

  2. 数字 1-9 在每一列只能出现一次。

  3. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

空白格用 '.' 表示。

LeetCode 037. 解数独

一个数独。

LeetCode 037. 解数独

答案被标成红色。

Note:

  • 给定的数独序列只包含数字 1-9 和字符 '.'

  • 你可以假设给定的数独只有唯一解。

  • 给定数独永远是 9x9 形式的。

Js中文网 – 前端进阶资源教程 www.javascriptC.com,typescript 中文文档
Javascript中文网是以前端进阶资源教程分享为主的专业网站,包括:前端、大厂面试题、typescript教程、程序人生、React.js……等,以帮助开发者成长为愿景的社区


思路:

这道题要求填充,解决办法就是回溯,但是每填一个数字,需要检查是否有效,如果每次都重新检查,时间消耗太高。

因此用hash保存初始的数字,后面回溯过程中,每填一个数字,只要检查hash便可以,有效即更新hash

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var solveSudoku = function(board) {
  let memRow=Array(9).fill().map(()=>Array(10).fill(false)),
      memCol=Array(9).fill().map(()=>Array(10).fill(false)),
      memBox=Array(9).fill().map(()=>Array(10).fill(false))
  let needToFill=[]
  for(let r=0;r<9;r++){
    for(let c=0;c<9;c++){
      let curVal=board[r][c]
      if(curVal!=='.'){
        memRow[r][curVal]=true
        memCol[c][curVal]=true
        let boxID=Math.floor(r/3)*3+Math.floor(c/3)
        memBox[boxID][curVal]=true
      }else{
        needToFill.push([r,c])
      }
    }
  }
  dfs(0)
  function dfs(index){
    if(index===needToFill.length)return true
    let [r,c]=needToFill[index]
    let boxID=Math.floor(r/3)*3+Math.floor(c/3)
    for(let val=1;val<10;val++){
      if(!memRow[r][val] && !memCol[c][val] && !memBox[boxID][val]){
        memRow[r][val]=true
        memCol[c][val]=true
        memBox[boxID][val]=true
        board[r][c]=val+''
        if(dfs(index+1))return true
        board[r][c]='.'
        memRow[r][val]=false
        memCol[c][val]=false
        memBox[boxID][val]=false
      }
    }
  }
};

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:LeetCode 037. 解数独

链接:https://www.javascriptc.com/4397.html

« LeetCode 038. 报数
阔别两年,webpack 5 正式发布了!»
Flutter 中文教程资源

相关推荐

QR code