回溯算法——LeetCode37 解数独
题目
力扣题目链接
思路
- 卡哥的思路,注意看他解释为什么是“二维回溯”。
- 我的思路,类似y总解决 N 皇后问题时的第二种方法,即从左上到右下枚举棋盘的每个位置。
至于为什么与 N 皇后问题不一样,我认为是因为它每一行不止放一个,每一行的每个位置都要进行考虑。
代码
- 卡哥代码见上方思路。
- 我的代码:
class Solution {
private:bool isValid(int row, int col, char val, vector<vector<char>>& board) {// 判断该行是否有重复for (int i = 0; i < 9; i++) {if (board[row][i] == val) {return false;}}// 判断该列是否有重复for (int i = 0; i < 9; i++) {if (board[i][col] == val) {return false;}}// 判断九宫格内是否有重复// 很巧妙int startRow = (row / 3) * 3;int startCol = (col / 3) * 3;for (int i = startRow; i < startRow + 3; i++) {for (int j = startCol; j < startCol + 3; j++) {if (board[i][j] == val) {return false;}}}return true;}// 有返回值是因为只需要找到一种可行的方案,好好理解一下bool backtracking(int x, int y, vector<vector<char>>& board) {// 遍历到一行的末尾了,就开始遍历下一行if (y == 9) {y = 0;x++;}// x == 9说明 0~8 这9行都遍历完了if (x == 9) {return true;}// 如果该位置还没填数的if (board[x][y] == '.') {// 遍历9种可能for (char i = '1'; i <= '9'; i++) {if (isValid(x, y, i, board)) {board[x][y] = i;if (backtracking(x, y + 1, board)) {return true;}board[x][y] = '.';}}// 9种都不行,就返回falsereturn false;}else {return backtracking(x, y + 1, board);}}public:void solveSudoku(vector<vector<char>>& board) {backtracking(0, 0, board);}
};
对于回溯函数为什么需要返回值的解释
ChatGPT:
你原来的代码(返回值为void)在找到一个解之后,会继续尝试其他可能的填充选项,并继续回溯,这样会导致找到的解可能会被覆盖,从而使最终输出的可能不是第一个找到的解,甚至可能无法正确地保留一个有效解。
详细分析
回溯的本质:
- 你的回溯算法会从左上角开始遍历整个数独网格。如果在某个位置找到了一个有效的填充数字,算法会继续前进,直到填满整个网格,或者无法找到合适的数字为止。
- 如果算法到达了一个无法继续的状态(即当前路径不再可行),它会回退到上一个状态并尝试其他可能的数字。
没有提前终止:
- 你的代码中没有检测到第一个有效解后提前终止的机制。
- 当回溯算法在最后一格填上数字时,虽然它找到了一个有效解,但是它不会立即返回,而是继续尝试回溯,试图寻找其他可能的解。
- 由于继续回溯,它可能会更改已经填好的数字,尝试其他路径,结果导致解被覆盖,或者递归无限循环而导致栈溢出(如你之前遇到的无限递归问题)。
覆盖问题:
- 在回溯过程中,每当你在一个位置填入一个数字后,都会立即调用递归函数进入下一步。
- 如果在某个位置找到的第一个有效数字满足所有条件,继续前进,最后递归完成一整次操作后,如果继续回溯,这个数字可能会被回溯掉,并试图用下一个数字替换。
- 因为没有及时终止,算法会尝试其他可能的数字组合,可能覆盖掉第一个找到的有效解。
解决方法
为了避免上述问题,关键在于:找到第一个有效解后立即终止进一步的回溯和搜索。这可以通过让递归函数在找到一个有效解时返回
true来实现,以阻止后续的任何修改。
相关文章:
回溯算法——LeetCode37 解数独
题目 力扣题目链接 思路 卡哥的思路,注意看他解释为什么是“二维回溯”。我的思路,类似y总解决 N 皇后问题时的第二种方法,即从左上到右下枚举棋盘的每个位置。 至于为什么与 N 皇后问题不一样,我认为是因为它每一行不止放一个…...
【CPP】继承语法详解与菱形继承
关于我: 睡觉待开机:个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想,就是为了理想的生活! 作者留言 PDF版免费提供:倘若有需要,想拿我写的博客进行学习和交流,可以私信我将免费提供PDF版。…...
数据结构(6.2_1)——领接矩阵法
图的存储——邻接矩阵法 邻接矩阵(Adjacency Matrix)是一种使用二维数组来表示图的方法。在这种表示法中,矩阵的行和列都对应图的顶点。 特点 对于无向图,如果顶点i与顶点j之间有边,则矩阵的第i行第j列(…...
诈骗未成功是否构成犯罪?
诈骗未成功不一定构成犯罪。在刑法上,构成诈骗罪需要满足特定的构成要件,包括有非法占有的目的、实施了虚构事实或隐瞒真相的行为、对方因此陷入错误认识并处分财产、行为人或第三方取得财产、被害人遭受财产损失。如果诈骗行为未能成功,即被…...
网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)
绪论: “节省时间的方法就是全力以赴的将所要做的事情完美快速的做完,不留返工重新学习的时间,才能省下时间给其他你认为重要的东西。” 本章主要讲到OSI网络协议栈中的应用层的作用和再次在应用层的角度理解协议的具体意义,以及…...
【NXP-MCXA153】i2c驱动移植
介绍 I2C总线由飞利浦公司开发,是一种串行单工通信总线,它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息(需要指定设备地址);常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等&#x…...
C++(11)类语法分析(2)
C(10)之类语法分析(2) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...
数字验证每日十问--(3)
深拷贝和浅拷贝的区别? 当只拷贝对象中的成员变量和声明的句柄时,称为浅拷贝。浅拷贝只把对象中的句柄复制了,却没有复制句柄b所指向的对象。这会导致复制后,a2中的句柄b 和 a1 中的句柄b指向同一个对象,如果a2中的句…...
22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合
22. Generate Parentheses 题目 给定 n 对括号,编写一个函数生成所有可能的正确匹配的括号组合。 例如,当 n = 3 时,可能的组合集合为: ["((()))","(()())","(())()","()(())","()()()" ]题目大意 给出 n 代表生成…...
检测到目标URL存在http host头攻击漏洞
漏洞描述 修复措施 方法一: nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 server { …...
C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
文章目录 📝基本框架🌠 构造和销毁🌉vector()🌉vector(const vector& v)🌉vector(size_t n, const T& value T())🌉赋值拷贝构造:vector<T>& operator(vector<T> v)&a…...
018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用
文章目录 1、mounted 和 beforeDestroy1.1、mounted1.2、beforeDestroy 2、父组件向子组件传递参数 props2.1、子组件定义2.2、父组件调用子组件并传参 3、完整例子3.1、父组件 Tags.vue3.2、子组件 TagsMenu.vue3.3、效果图 1、mounted 和 beforeDestroy 1.1、mounted mount…...
xlnt在Windows中的dll,lib生成
前言 花了半天时间想要把xlnt 集成到VS2022 Cmake项目中,以我目前掌握的能力,Cmake语法对于我来说难懂,对于只是使用过Cmake编译MySQL,或是其他lib,dll库的小白来说,不应该为了显示自己能力多么出众,强行去配置一些程序内容。 生活中没有绝对的事情,有舍有得. https://github…...
【网络】私有IP和公网IP的转换——NAT技术
目录 引言 NAT工作机制编辑 NAT技术的优缺点 优点 缺点 个人主页:东洛的克莱斯韦克-CSDN博客 引言 公网被子网掩码划分为层状结构,一个公网IP的机器又可以用很多私有IP搭建内网。在日常生活场景中用的都是私有IP,例如手机,…...
java 面试 PDF 资料整理
“尊贵的求知者,作者特此献上精心编纂的Java面试宝典PDF,这份资料凝聚了无数面试精华与实战经验,是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行,只需轻轻一点,完成这象征支持与认可的一键三联&am…...
初步认识Linux系统
前言 Linux系统具有许多优点,不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,…...
JavaScript AI 编程助手
JavaScript AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了前所未有的变革。JavaScript,作为全球最流行的编程语言之一,其与AI的结合为开发者带来了巨大的便利和无限的可能性。本文将探讨JavaScript AI编程助手的定义、功能…...
达梦数据库的系统视图v$datafile
达梦数据库的系统视图v$datafile 达梦数据库的V$DATAFILE 是一个重要的系统视图,提供了有关数据库数据文件的信息。 V$DATAFILE 系统视图 V$DATAFILE 视图用于显示数据库中每一个数据文件的详细信息。通过查询这个视图,数据库管理员可以了解数据文件的…...
Triton/window安装: triton-2.0.0-cp310-cp310-win_amd64.whl文件
下面这个github仓: https://github.com/PrashantSaikia/Triton-for-Windows/tree/main 安装命令也很简单,下载到本地后运行: pip install triton-2.0.0-cp310-cp310-win_amd64.whl...
应急响应-DDOS-典型案例
某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日,某机构门户网站无法访问,网络运维人员称疑似遭受DDoS攻击,请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后,通过查看流量设备,发现攻击者使用僵…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
