JavaScript|LeetCode|搜索|37.解数独

回溯算法本质:决策树建模与剪枝思维 回溯算法是一种基于决策树的系统性搜索方法,其核心在于将问题抽象为‘状态定义—选择枚举—约束表达’三步建模过程。它并非单纯依赖递归实现,而是体现‘试错+撤回’的问题求解本能;剪枝也不是性能优化技巧,而是对可行性约束的精准翻译。该思想广泛应用于组合、排列、子集、N皇后等经典问题,并延伸至编译器寄存器分配、芯片布线、基因序列比对及AI模型轻量化等工程场景。掌握回溯,关键在于理解决策树结构如何由问题约束决定,以及如何将业务规则转化为代码中的剪枝逻辑。 阅读详情

法1:回溯
想法:

  1. 遍历数独中每一个空白格,依次填入1~9,每一次填入都要检验其合法性(即行、列、3×3宫不重复),不合法则变回’.’(对当前空白格填入1到9均不合法,则说明前面的有些空白格填错了,回溯),合法则进入下一阶段
  2. 从上一个填的空白格所在行开始检索(前面的行已经填了),与步骤1相同,依次填入1~9,合法则继续进行下一阶段,不合法则回溯
/** 
* @param {character[][]} board 
* @return {void} Do not return anything, modify board in-place instead. 
*/
var solveSudoku = function(board) {    
    backtrack(board, 0);
};

function backtrack(board, r) {    
    var i = r, j = 0, k = 0;    
    var character = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];    
    for(; i < 9; i++) {        
        for(j = 0; j < 9; j++) {            
            if(board[i][j] == '.') {                
                for(k = 0; k < 9; k++) {                    
                    board[i][j] = character[k];                    
                    if(!valid(board, i, j)) {                        
                        board[i][j] = '.';                        
                        continue;                    
                    }                    
                    if(!backtrack(board, i)) { // 如果没有合适的数可以满足剩余空格的规则                        
                        board[i][j] = '.'; // 回溯,试试下一个数                    
                    }                    
                    else {                        
                        return true;                    
                    }                
                }                
                if(board[i][j] == '.') {                    // 1~9 没有合适的数可填入                    
                    return false;                
                }            
            }        
        }    
    }    
    return true;
}

function valid(board, r, c) { 
    // 检测填入一个数之后,整个board是否符合条件    
    // 每行,每列,3×3    
    var i = 0, j = 0;    
    var row = [], col = [];    
    var temp1 = Math.floor(r / 3) * 3, temp2 = Math.floor(c / 3) * 3;    
    var obj = {'1' : 0, '2' : 0, '3' : 0, '4' : 0, '5' : 0, '6': 0, '7' : 0, '8' : 0, '9' : 0};
    // 记录3×3宫中出现的数字的次数
    
    for(i = 0; i < 9; i++) {        
        row[i] = board[r][i];        
        col[i] = board[i][c];    
    }
    for(j = 0; j < 9; j++) { // 行,列        
        if(row[j] != '.') {            
            if(row.indexOf(row[j], j + 1) > j) {                
                return false;            
            }        
        }        
        if(col[j] != '.') {            
            if(col.indexOf(col[j], j + 1) > j) {                
                return false;            
            }        
        }    
    }
    for(i = temp1; i < temp1 + 3; i++) { // 3 × 3的行        
        for(j = temp2; j < temp2 + 3; j++) { // 3 × 3的列            
            if(board[i][j] != '.') {                
                obj[board[i][j]]++;            
            }        
        }    
    }
    for(var x in obj) {        
        if(obj[x] > 1) {            
            return false;        
        }    
    }
    return true;
}
程序员必备75道逻辑思维题(附答案)之二 逻辑训练 身为一个大数据工程师,平时的算法训练还是不能少的,今天给大家看几道我曾经看到的逻辑思维题觉得很好,想分享一下。 【6】一个球、一把长度大约是球的直径2/3长度的直尺.你怎样测出球的半径?方法很多,看看谁的比较巧妙 【7】五个大小相同的一元人民币硬币。要求两两相接触,应该怎么摆? 【8】猜牌问题 S先生、P先生、Q先生他们知道桌子的抽屉里有16张扑克牌:红桃A、Q、4 黑桃J、8、4、2、... 阅读详情

相关推荐

Arm Neoverse CMN-700 QoS与PrefetchTarget架构解析

在现代多核处理器系统中,内存访问性能优化是提升整体效能的关键。QoS(服务质量)技术通过优先级调控机制,确保关键任务获得更高的缓存带宽和内存访问权限。PrefetchTarget作为预取技术的一种实现,能够显著降低内存访问延迟,特别适用于AI训练和数据库系统等高性能计算场景。Arm Neoverse CMN-700通过RN SAM模块实现了硬件级的地址范围检测和优先级调控,支持最多8个独立内存区域的QoS配置。测试数据显示,合理配置QoS可使关键任务延迟降低40%,而PrefetchTarget技术则能减少

weixin_36197669的博客 314

利用python 完成 leetcode 37 解数独

编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 ‘.’ 表示。 一个数独。 答案被标成红色。 Note: 给定的数独序列只包含数字 1-9 和字符 ‘.’ 。 你可以假设给定的数独只有唯一解。 给定数独永远是 9...

找到工作之前一天十篇的博客 592

工业机器人关节拆装流程_一文读懂模块化直驱电机及机器人关节模组

私信“干货”二字,即可领取138G伺服与机器人专属及电控资料!如果说芯片是智能行业最为重要的核心元件,那么电机几乎可以说是支撑了整个自动化和大工业生产以及现代社会最为重要的部件,全世界90%的能源是由电机发出来的,而70%是由电机消耗调的,电机可以说是整个人类社会能源循环的占有绝对地位的产品。普通伺服电机伺服电机其实已经算是电动机中比较高端的类型,特别是永磁同步类型的伺服电机,由于其启动快速,惯量...

weixin_32159771的博客 2154

leetCode 37 解数独 Soduko Solver

leetCode 37 解数独 Soduko Solver 以前比较喜欢玩数独,一直想尝试一下编程解数独,练习算法时看到LeetCode上正好有这样一题,于是决定做一下。做出来的过程中确实花费了一番功夫,遂记录下来整个过程。 整理思路 开始时一头雾水,于是回想自己做数独的逻辑与策略: 1. 有没有哪一个位置开始就可以确定值的?把能确定值的空格全部填上 2. 当剩余的空格为多解...

q1325545052的博客 1170

基于Transformers库的BERT模型:一个文本情感分类的实例解析

简介 本文来讲述BERT应用的一个例子,采用预训练好的BERT模型来进行演示。BERT的库来源于Transformers,这是一个由PyTorch编写的库,其集成了多个NLP领域SOTA的模型,比如bert、gpt-2、transformer xl等,并且可以自由选择已经预训练好的模型参数,我们可以基于这些参数进行进一步的训练调试。 Part 1: 利用BERT基于特征的方式进行建模 1、任务与数...

蓝天白云梦的csdn博客 2万+

OTN传送网实战指南:从光层到电层的完整架构解析(附配置示例)

本文深入解析OTN传送网从光层到电层的完整架构,涵盖关键组件、技术实现及配置示例。通过高速公路与光传送网的类比,详细介绍了光层超宽传输管道构建、电层业务调度核心引擎以及控制平面智能运维实战。附有典型组网方案与故障排查指南,助力网络工程师高效部署与维护OTN传送网。

tomato的博客 683

leetcode:51. N 皇后、37. 解数独(JavaScript)

文章目录51. N 皇后思路:本题分两步解:37. 解数独思路要点:判断当前位置放当前元素是否合法总结 51. N 皇后 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。 示例 1: 输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.",

weixin_46015333的博客 509

(八)DDR_PHY架构及功能——(PUB组成、初始化及Training流程、Clock关系)

文章目录一、DDR_PHY结构组成1.1、DDR Memory子系统1.2、DDR_PHY架构组成1.3、PUB模块功能实现流程1.3.1、DDR系统初始化流程1.3.2、PLL初始化流程 一、DDR_PHY结构组成 1.1、DDR Memory子系统   Memory子系统主要由DDR Controller和DDR_PHY(含DDR_IO)两个部分组成。DDR Controller主要承担其它子系统(如CPU)与Memory子系统进行数据交互时的传输效率及调度,DDR_PHY主要负责数据交互过程中的传输速

Mr.翟的博客 1万+

LeetCode37. 解数独

编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3宫内只能出现一次。 空白格用 ‘.’ 表示。 一个数独。 答案被标成红色。 Note: 给定的数独序列只包含数字 1-9 和字符 ‘.’ 。 你可以假设给定的数独只有唯一解。 给定数独永远是...

明觉 390

最全的Hermes安装教程以及Hermes WebUI安装部署和配置指南

* 直接执行命令**

小石头的专栏 1074

泰凌微8258入门教程 基础篇①——Bluetooth® SIG Mesh 快速上手

Bluetooth® SIG Mesh Quick Start

6729

【leetcode】 37. 解数独

一 、运用 回溯法 解数独 回溯法算法思想:(参考 回溯法) 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 1、回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的最优解...

梦情与你的博客 341

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Leetcode 37. Sudoku Solver 解数独

Leetcode 37. Sudoku Solver 解数独 标签: Leetcode 题目地址:https://leetcode-cn.com/problems/sudoku-solver/ 题目描述 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现...

CoderWangSon 480

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

力扣刷题37.解数独

力扣刷题:37.解数独

m0_63953077的博客 420

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

leetcode习题集——37. 解数独

题目 编写一个程序,通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 空白格用 '.' 表示。 解: Note: 给定的数独序列只包含数字 1-9 和字符 '.' 。 你可以假设给定的数独只有唯一解。 给定数独永远是 9x9 形式的。 算...

jessio的博客 244

【LeetCode】题解合集(JavaScript版)

LeetCode题解合集

公众号:前端充电宝 2964

leetcode算法练习 JavaScript实现

leetcode 表格内容由spider.js从leetcode-cn.com爬取。 已做题目答案也从leetcode-cn.com中爬取并生成文件。 解题进度:已解决 134/629&amp;amp;amp;nbsp;-&amp;amp;amp;nbsp;简单&amp;amp;amp;nbsp;92&amp;amp;amp;nbsp;中等&amp;amp;amp;nbsp;36&amp;amp;amp;nbsp;困难&amp;amp;am

liusaint1992的专栏 8570

LeetCode Javascript 刷刷刷~~

用javascript从头开始整理leetcode刷题过程中的思路啊,代码啊什么的,提高一下自己的算法能力吧~ 作为自己提高代码量的一种方法吧。反正使劲儿刷,刷完了就复习。整理下来以便以后查阅 Number Name Difficulty 1 Two Sum 两数之和 Easy 2 Add Two Numbers 两数相加 Medium ...

可以叫我啪叽的石头 1894

LeetCode1-620题汇总,希望对你有点帮助!

时间很快,公众号发布的LeetCode题目,已经达到620道题了。今天把发布的1-620篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算法感兴趣的,建议可以每篇认真阅读一下!LeetCode刷题实战1:在数组上遍历出花样LeetCode刷题实战2:用链表模拟加法LeetCode刷题实战3:最长不重复子串LeetCode刷...

程序IT圈 745

LeetCode算法题目录1-50

1. 两数之和 44.9% 简单 2. 两数相加 32.8% 中等 3. 无重复字符的最长子串 28.3% 中等 4. 寻找两个有序数组的中位数 33.7% 困难 5. 最长回文子串 24.6% 中等 6. Z 字形变换 40.8% 中等 7. 整数反转 31.7% 简单 8. 字符串转换整数 (atoi) 16.5%...

Alex的博客 539

LeetCode1-160题汇总,希望对你有点帮助!

时间很快,公众号发布的LeetCode题目,已经达到160道题了。今天把发布的1-160篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于...

程序IT圈 186

LeetCode1-480题汇总,希望对你有点帮助!

时间很快,公众号发布的LeetCode题目,已经达到480道题了。今天把发布的1-480篇LeetCode文章整理一下,平时文章都放在比较末尾,阅读量都不高,相信很多人都没看过,如果对于算...

程序IT圈 404

搞懂回溯算法,我终于能做数独了

点击上方蓝字设为星标东哥带你手把手撕力扣~作者:labuladong 公众号:labuladong若已授权白名单也必须保留以上来源信息经常拿回溯算法来...

fdl123456的博客 2014

JavaScript|LeetCode|动态规划|343.整数拆分

法1:动态规划 看了题解 想法: “给定一个正整数 n,将其拆分为至少两个正整数的和”。则 n >= 2 用数组dp保存整数 1 ~ n 经拆分后的最大乘积(后续需用到dp[1] = 1,比如 3 = 1 + 2) 拆分整数 i 时,先将其拆分为 i - j 和 j;最大值在下面几种情况中产生: (i - j) * j:即 i - j 和 j 均不再拆分 dp[i - j] * dp[...

J_learner的博客 634

JavaScript|LeetCode|动态规划|322. 零钱兑换

法1:动态规划 看了题解 想法: 总金额amount是背包容量 coins是物品(coins.length是物品种类;coins[i]为每种物品的体积) 每种物品有无限个 目标:用最少数量的物品把背包填满 /** * @param {number[]} coins * @param {number} amount * @return {number} */ var coinChange...

J_learner的博客 503

JavaScript|LeetCode|动态规划|72. 编辑距离

法1:动态规划 想法: 先看看题目给的例子:word1 = “horse”, word2 = “ros” 初始化:每增加一行,表示指向 word1 的指针(i)向后移动一个字符;每增加一列,表示指向 word2 的指针(j)向后移动一个字符;当一个字符串为空时,另一个串只需要不断删除字符即可;假设填写数字的部分为 dp 数组,里面的数字为使得 word1 和 word2 当前字符串(即从第 0 位到各自指针指向的位置)相等的最小操作数 进行表格的填写,发现规律 对于dp[1][1],因为word1[

J_learner的博客 441
上一篇: JavaScript|LeetCode|搜索|78.子集
下一篇: JavaScript|LeetCode|搜索|51.N皇后
J_learner
博客等级 码龄8年 2粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值