数据结构与算法--回溯法

回溯法

  • 1 括号生成
    • 分析:
  • 2 解数独
    • 分析
    • 代码

回溯法本质是的暴力枚举/遍历法,一般用递归实现。
当我们可以把问题分解为若干个步骤,每个步骤都有若干个选择的时候,若需要列出所有解答形式,则采用枚举法。

1 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

分析:

有效的括号一定是现有左括号,再有有括号,无论在哪个位置,左括号的数量要大于等于右括号。

  1. n=1时:

1个,一个,第一个位置永远只能是,第二个位置就只剩下了,所以只有["()"]

  1. n=2时:

第一个只能是(,第二个可以是(也可以是)
第二个是(时,两个(都用完了,第三个和第四个都只能是)
第二个是)时,目前‘(’个数等于‘)’个数,第三个只能是‘(’,第三个和第四个都只能是)`了

pos0123
(
(

综上,我们需要num_left,num_right计算目前已经有的左右括号的个数,只有右括号个数小于左括号个数的时候,下一个才能是右括号,否则(右括号个数等于左括号个数)下一个只能左括号,可以用递归的形式写。

#python
class Solution:def generateParenthesis(self, n: int) -> list[str]:def helper(index,n,right_num,left_num):if len(subs)==2*n:ans.append(''.join(subs))elif index<2*n:if index==0:subs.append('(')helper(index+1,n,right_num,left_num+1)else:if left_num<n:subs.append('(')helper(index+1,n,right_num,left_num+1)subs.pop()if right_num<left_num:subs.append(')')helper(index+1,n,right_num+1,left_num)subs.pop()subs = []ans = []helper(0,n,0,0)return ans

2 解数独

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

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

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
在这里插入图片描述

输入:board = [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"]]
输出:[["5","3","4","6","7","8","9","1","2"],["6","7","2","1","9","5","3","4","8"],["1","9","8","3","4","2","5","6","7"],["8","5","9","7","6","1","4","2","3"],["4","2","6","8","5","3","7","9","1"],["7","1","3","9","2","4","8","5","6"],["9","6","1","5","3","7","2","8","4"],["2","8","7","4","1","9","6","3","5"],["3","4","5","2","8","6","1","7","9"]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:

在这里插入图片描述

分析

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

可以遍历每一个数字,找不到的时候回溯,分析:
使用(i,j)表示当前遍历的位置,使用row[i]表示第i行已经存在的数字,col[j]表示第j列已经存在的数字,box[(i//3)*3+j//3]是当前位置所在格子已经存在的数,row[i],col[j],box[(i//3)*3+j//3]是哈希表方便查询。
边界条件

  • 当i==9的时候,代表所有格子都遍历完了
  • 当j==9的时候,代表要换行了
  • 当board[i][j]为数字时,不用填数字,直接下一个

非边界条件:
这个时候要从1-9里面选还没有在row[i],col[j],box[(i//3)*3+j//3]中出现的数字填进格子,如果helper(i,j+1) return true,说明可以填;否则,回溯,删掉数字继续遍历,如果所有数字都遍历完也没找到,return False

代码

class Solution:def solveSudoku(self, board: list[list[str]]) -> None:"""Do not return anything, modify board in-place instead."""def helper(board,row,col,box,i,j):if i==9:return Trueif j==9:return helper(board,row,col,box,i+1,0)if board[i][j]!='.':return helper(board,row,col,box,i,j+1)box_index = (i//3)*3+(j//3)for num in range(1,10):if num not in row[i] and num not in col[j] and num not in box[box_index]:row[i][num]=1col[j][num]=1box[box_index][num]=1board[i][j]=str(num)if helper(board,row,col,box,i,j+1):return Truedel row[i][num]del col[j][num]del box[box_index][num]board[i][j]='.'return Falsem = len(board)n = len(board[0])row = [{} for _ in range(m)]col = [{} for _ in range(n)]box = [{} for _ in range(m // 3 * n // 3)]for i in range(m):for j in range(n):num = board[i][j]if num!='.':num = int(num)row[i][num]=1col[j][num]=1box[(i//3)*3+(j//3)][num]=1helper(board,row,col,box,0,0)return board

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外卖小程序的研究与开发ssm+论文源码调试讲解

2系统关键技术 2.1微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普通…

花了6000多考下PMP却不会用?你真的懂PMP实际用法吗?

大家都已经下载了PMP的电子版证书吗&#xff1f;虽然拿到了电子证书&#xff0c;但很多人又开始期待纸质版证书。不要着急&#xff0c;考试后需要6-9个月才能拿到纸质版证书&#xff0c;可能还需要等一段时间。 电子证书和纸质证书具有同样的有效性&#xff0c;需要使用证书时…

Spring面向切面编程

目录 1.AOP概述及Spring AOP实现原理 AOP概述 AOP的应用场景 AOP的作用 Spring AOP概述 Spring AOP的实现原理 Spring AOP中Advice的分类 2. 通过xml配置实现AOP 实现步骤&#xff1a; 新增模块&#xff1a; 导入相关依赖&#xff1a; 新增实体类User 新增业务类UserS…

Javaweb选课系统-开源计划-起源-001-完全免费开源

项目部署&#xff0c;效果视频 https://www.bilibili.com/video/BV1LMDUY8Ef7/?spm_id_from333.880.my_history.page.click&vd_source17d16b2e328f19328e077e9cb07565ef项目地址&#xff1a; https://gitee.com/lucky-six/Javaweb-xuanke

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Linux云计算 |【第五阶段】PROJECT3-DAY1

主要内容&#xff1a; 跳板机&#xff08;堡垒机&#xff09;的概念、部署JumpeServer 一、跳板机&#xff08;堡垒机&#xff09;的概念 跳板机&#xff08;Jump Server 或 Bastion Host&#xff09;是一种网络安全设备或服务器&#xff0c;也称堡垒机&#xff0c;是一类可作…

宠物空气净化器哪个牌子好?希喂、352两款产品吸力、噪音真实测试

我身为养宠博主&#xff0c;这些年用过不少宠物空气净化器&#xff0c;花费了1w&#xff0c;对很多产品都进行过测评。正值双十一&#xff0c;很多朋友都在问我宠物空气净化器到底有没有必要买&#xff1f;答案毫无疑问是有必要&#xff01; 相比较于其他清理工具&#xff0c;…

Clang-Tidy 是什么?如何让你的代码更干净无瑕

Clang-Tidy&#xff1a;让你的代码更干净&#xff0c;让潜在问题无处遁形 在现代软件开发中&#xff0c;代码质量不再仅仅体现在功能实现上&#xff0c;还包括其可维护性、可读性和潜在问题的检测。clang-tidy 是一款功能强大的静态分析工具&#xff0c;专为 C/C 代码而生&…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

【算法】(Python)动态规划

动态规划&#xff1a; dynamic programming。"programming"指的是一种表格法&#xff0c;而非编写计算机程序。通常解决最优化问题&#xff08;optimization problem&#xff09;。将问题拆分成若干个子问题&#xff0c;求解各子问题来得到原问题的解。适用于多阶段…

PySpark本地开发环境搭建

一.前置事项 请注意&#xff0c;需要先实现Windows的本地JDK和Hadoop的安装。 二.windows安装Anaconda 资源&#xff1a;Miniconda3-py38-4.11.0-Windows-x86-64&#xff0c;在window使用的Anaconda资源-CSDN文库 右键以管理员身份运行&#xff0c;选择你的安装路径&#x…

深度学习经典模型之ZFNet

1 ZFNet 1.1 模型介绍 ​ ZFNet是由 M a t t h e w Matthew Matthew D . Z e i l e r D. Zeiler D.Zeiler和 R o b Rob Rob F e r g u s Fergus Fergus在AlexNet基础上提出的大型卷积网络&#xff0c;在2013年ILSVRC图像分类竞赛中以11.19%的错误率获得冠军&#xff08;实际…

2024网盘搜索引擎合集推荐:高效搜索资源的利器

2024网盘搜索引擎合集推荐&#xff1a;高效搜索资源的利器 在这个信息爆炸的时代&#xff0c;找到合适的资源变得越来越重要。以下是一些网盘搜索引擎的推荐&#xff0c;它们可以帮助您快速找到所需的文件和资料。 咔帕搜索&#xff1a;简单高效的云盘搜索 网址&#xff1a;…

最新榜单!国内免费好用的OA协同软件前十名

在现代企业管理中&#xff0c;OA&#xff08;Office Automation&#xff09;协同软件已成为提升工作效率、简化沟通流程的重要工具。OA协同软件的主要功能涵盖任务管理、文件共享、审批流程、日程安排等&#xff0c;从而帮助企业更高效地进行跨部门协作、信息传递和项目跟踪。在…

Java自动点名器实现案例详解

Java自动点名器实现案例详解 在教学管理中&#xff0c;点名是一项重要的任务。随着技术的发展&#xff0c;使用编程语言实现自动化的点名器不仅可以提高效率&#xff0c;还能增加课堂的互动性和趣味性。本文将详细介绍三个案例&#xff0c;分别是简单随机点名器、带有权重的随…

揭秘规则引擎:如何实现多版本无感切换与数据源同步

在现代业务系统中&#xff0c;规则决策引擎能够自动化处理复杂的业务逻辑。为了满足不断变化的业务需求&#xff0c;同时确保系统运行的连续性和稳定性&#xff0c;在JVS规则引擎中提供了多版本无感发布和数据源变更日志同步功能。 多版本无感发布 多版本无感发布主要适用于已…

【Python3】【力扣题】409. 最长回文串

【力扣题】题目描述&#xff1a; &#xff08;题意理解&#xff09;统计如下&#xff1a; ① 字母个数本身是偶数。 ② 字母个数是奇数&#xff0c;统计奇数中的偶数部分&#xff0c;例如&#xff1a;字母个数为3&#xff0c;统计其中的2。 ③ 中间可以有一个奇数字母。即只要有…

010 Editor下载安装和使用

010 Editor下载安装和使用 010 Editor&#xff08;也称为 SweetScape 010 Editor&#xff09;是一款功能强大的二进制文件编辑器和文本编辑器。它主要用于查看、编辑和分析各种二进制文件和文本文件&#xff0c;特别适用于处理数据恢复、磁盘编辑、编程和系统管理等领域。 1 …

【安装教程】统信UOS1070上使用vsftpd服务上传下载文件

原文链接&#xff1a;【安装教程】统信UOS1070上使用vsftpd服务上传下载文件 Hello&#xff0c;大家好啊&#xff01;今天带来一篇关于在统信UOS 1070上使用vsftpd服务实现加密文件上传和下载的文章。默认的FTP传输是不加密的&#xff0c;但在数据传输时&#xff0c;安全性尤为…

Linux之实战命令70:chcon应用实例(一百零四)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…