算法套路十二——回溯法之排列型回溯

news2024/9/17 9:25:05

算法套路十二——回溯法之排列型回溯

  • 该节是在第十节回溯法之子集型回溯的基础上进行描写,组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求, 故请首先阅读第十节算法套路十——回溯法之子集型回溯

算法示例一:LeetCode46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。在这里插入图片描述

在这里插入图片描述
相比子集型回溯,排序型回溯的区别就是在选择相同子集时不会判断为重复,而是不同的排列,因此我们从答案的角度出发,考虑每次选哪一个数,且由于选择顺序不同排列也不同,故在递归时不用考虑要使后选的元素大于当前选的元素,那我们如何判断是否选择,可以使用on_path数组,来记录数组第i个元素是否被选择,且要在递归完成后回溯

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        n=len(nums)
        ans=[]
        path=[]
        on_path=[False]*n
        def dfs(i:int)-> None:
            if i==n:
                ans.append(path.copy())
                return
            for j in range(0,n):
                if on_path[j]==False:
                    on_path[j]=True
                    path.append(nums[j])
                    dfs(i+1)
                    on_path[j]=False
                    path.pop()
        dfs(0)
        return ans

算法示例二:LeetCode51. N 皇后

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。在这里插入图片描述

本题是一道回溯法的经典题,第一次做时可能感觉难,认为要求很多,但如果搞懂题目要求并能使用回溯就会发现很简单。题目即要求行i、列j、左对角线值即i-j,右对角线即i+j不能重复

  • 用on_path记录当前列数是否已经被占据,
  • 用inclined_left集合来记录i-j的值来判断左对角线是否已经被占据,i-j相同即在同一左对角线
  • 用inclined_right集合来记录i-j的值来判断左对角线是否已经被占据,i+j相同即在同一右对角线

之后我们从答案的角度来对每一行应该选择哪一列来放皇后进行枚举,如果满足当前列数、左对角线、右对角线都没有占据,那么就记录、递归、回溯三步直接进行枚举

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        path=[]
        ans=[]
        #列数
        on_path=[False]*n
        #左对角线,i-j相同即同一左对角线
        inclined_left=set()
        #右对角线,i+j相同即同一右对角线
        inclined_right=set()
        def dfs(i:int)->None:
            if i==n:
                ans.append(['.' * c + 'Q' + '.' * (n - 1 - c) for c in path])
                return
            #i行j列
            for j in range(0,n):
                if on_path[j]==False and i-j not in inclined_left and i+j not in inclined_right:
                    path.append(j)
                    on_path[j]=True
                    inclined_left.add(i-j)
                    inclined_right.add(j+i)
                    dfs(i+1)
                    path.pop()
                    on_path[j]=False
                    inclined_left.remove(i-j)
                    inclined_right.remove(j+i)
        dfs(0)
        return ans    
            

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

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

相关文章

windows环境安装tensorflow-gpu-2.10.1

Tensorflow 2.10是最后一个在本地windows上支持GPU的版本 1. 通过.whl文件方式安装2.创建anaconda虚拟环境3.安装对应的cuda与cudnn版本,local不必装cuda和cudnn4. 测试tensorflow gpu是否可用 1. 通过.whl文件方式安装 .whl文件的下载地址: tensorflow…

Linux — 线程概念和线程控制

目录 一、 线程的概念 什么是线程? 线程的优点 线程的缺点 线程异常 线程用途 二、线程的控制 创建线程 pthread_create函数 线程终止 pthread_exit函数 pthread_cancel函数 线程等待 pthread_join函数 分离线程 一、 线程的概念 之前的文章说过每个进程有…

IDE后端启动JetLinks 物联网基础平台(2.x)

目录 一、官网 二、文档中心 三、下载源码 四、安装依赖 五、IDE配置 六、修改配置文件:jetlinks-standalone/src/main/resources/application.yml 七、启动项目(项目会自动建表) 一、官网 JetLinkshttps://www.jetlinks.cn/#/ 二、…

率先实现One-box量产后,这家厂商重磅发布智能底盘“三步走”战略

率先实现One-box和Two-box产品量产之后,利氪科技向业界发布了重要的产品布局规划及进展。 在4月18日开幕的上海国际车展上,利氪科技重磅发布了全新的智能化线控底盘产品矩阵,同时发布了智能底盘“三步走”计划。据了解,利氪科技将…

数据结构(五)—— 栈与队列

文章目录 前言一、基础1.1 stack1.2 queue 二、题2.1 232 用栈实现队列2.2 225 用队列实现栈2.3 20 有效的括号2.4 1047 删除字符串中的所有相邻重复项 前言 灵魂四问: 1、C中stack,queue 是容器么? 答:不是,而是容器…

高数基础3

目录 极限的概念,性质以及存在准则 求极限的方法 ​编辑 常用的基本极限 1的无穷次方常用的结论 例题: 方法2:利用等价无穷小代换求极限 例题: 常用的等价无穷小 利用有理运算法则求极限 例题 极限的概念,性质以…

【C语言】函数讲解(上)

【C语言】函数讲解(上) 1.函数是什么2.C语言中函数的分类2.1库函数2.1.1如何学会使用库函数 2.2.自定义函数 3.函数的参数3.1实际参数(实参)3.2形式参数(形参) 4.函数调用4.1传值调用4.2传址调用4.3练习 所…

Redis分布式锁实现方案

一、什么是分布式锁,与本地锁有什么区别 本地锁: 解决同一进程内多个线程操作同一资源的问题。 分布式锁: 解决多个进程同时操作同一资源的问题。 二、Redis的SETNX Redis之所以能实现分布式锁,得益于Redis的单线程处理模式&am…

Macbook(苹果电脑) VSCode 创建简单c++程序 配置C++开发环境

1.打开 Terminal 终端(Command空格,输入Terminal)。 1.1 输入如下指令,查看是否显示版本信息。 clang --version 1.2 如果出现版本信息,则跳过,否则输入 xcode-select --install 2. 为 VS Code 安装插件 …

docker中的四种网络模式

docker中的四种网络模式 实现原理四类网络模式host模式container模式none模式bridge模式 实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Con…

MySQL_第06章_多表查询

第06章_多表查询 讲师:尚硅谷 - 宋红康(江湖人称:康师傅) 官网: http://www.atguigu.com 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。 前提条件:这些一起查询的…

【Python】darts包(Python时序预测库的安装方法)+conda环境和库的建立

一、介绍 "darts"是一个Python编程语言中的数据处理和时间序列分析工具包。它提供了一系列用于处理、建模和分析时间序列数据的功能,包括时间序列的预处理、特征工程、模型训练和预测等。darts包含了许多常用的时间序列模型,如ARIMA、Prophet…

Linux权限 - 概念与管理 | 文件权限的修改与转让 【详解】

目录 Linux权限 Linux权限的概念 Linux权限的基础操作 (1).实现用户账号的切换 (2).仅提升当前指令的权限 Linux权限管理 1、文件访问者的分类(人) 2、文件类型和访问权限(事物属性) 3、文件权限值的表示方法 4、文件访…

数据结构与算法基础(王卓)(28):排序概述(分类)、直接插入排序思路

目录 排序分类:(本章目录) 按数据存储介质:(学习内容) 内部排序: 外部排序: 按比较器个数:(学习内容) 串行排序: 并行排序&…

arduino学习笔记2

一.蜂鸣器输出实验 1.源代码 int buzzer2;//设置控制蜂鸣器的数字口对应板子上2口 void setup() { pinMode(buzzer,OUTPUT);//设置对应的输出模式 } void loop() { unsigned char i,j;//定义变量while(1) { for(i0;i<50;i)//输出一个频率的声音{ digitalWrite(buzzer,H…

2023年4月的12篇AI论文推荐

GPT-4发布仅仅三周后&#xff0c;就已经随处可见了。本月的论文推荐除了GPT-4以外还包括、语言模型的应用、扩散模型、计算机视觉、视频生成、推荐系统和神经辐射场。 1、GPT-4 Technical Report Sbastien Bubeck, Varun Chandrasekaran, Ronen Eldan, Johannes Gehrke, Eric…

密码技术知识总结

密码技术知识总结 1. 密码技术简介 对称密码&#xff1a;加密和解密时使用同一密钥的方式公钥密码&#xff1a;加密和解密时使用不同密钥&#xff0c;也称非对称密码单向散列函数&#xff1a;保证数据的完整性&#xff0c;检测数据是否被篡改过 散列值&#xff1a;又称哈希值…

k8s 控制器---Statefulset

1. Statefulset 控制器 StatefulSet 是为了管理有状态服务的问题而设计的。 1.1 什么叫有状态服务&#xff1f; StatefulSet 是有状态的集合&#xff0c;管理有状态的服务&#xff0c;它所管理的 Pod 的名称不能随意变化。数据 持久化的目录也是不一样&#xff0c;每一个 Pod …

Unity --- UGUI --- Rect Transform(矩形变换) --- 锚点及其相关应用

1.所有的UI物体都没有Transform组件&#xff0c;取而代之的是Transform组件的派生 --- Rect Transform(矩形变换) 2.Rect Transform和Transform一样都有旋转和缩放&#xff0c;它两之间的区别是&#xff1a; Rect Transform多了&#xff1a;a.Pibot轴心点&#xff1b;b.Ancho…

002 学习鸿蒙应用开发ArkTs语言

目录 一.ArkTs语言介绍 1.ArkTs语言概述 2.ArkTs语言特性 二.基本UI描述 1.基本概念 2.UI描述规范 无参数构造配置 有参数构造配置 属性配置 事件配置 子组件配置 三.状态管理 1.基本概念 2.页面级状态管理 State Prop Link Observed和ObjectLink数据管理 P…