Python 递归、迷宫问题、八皇后问题

递归应用场景

  • 各种数学问题,如八皇后问题、汉诺塔、阶乘问题、迷宫问题、球和篮子问题等
  • 各种算法中也会使用到递归,比如快排、归并排序、二分查找、分治算法等
  • 能够用栈解决的问题
  • 递归的优点就是代码比较简洁

迷宫问题(Python版)

迷宫示意图, 红色部分表示墙,绿色部分表示通路,第一张图为初始迷宫,第二张为回溯之后的迷宫

      

代码实现

class MiGong:def __init__(self):# 创建一个 8*7 嵌套列表,模拟迷宫self.map = []row = 8col = 7# 初始化迷宫# 1表示墙,0表示可通行# 将第0行设置为墙for i in range(row):ls = []for j in range(col):if i == 0 or i == 7 or j == 0 or j == 6:ls.append(1)else:ls.append(0)self.map.append(ls)self.map[3][1] = 1self.map[3][2] = 1self.map[4][3] = 1self.print_map()# 打印迷宫def print_map(self):row = len(self.map)col = len(self.map[0])for i in range(row):for j in range(col):print(self.map[i][j], end=' ')print()print()def find_way(self, i: int, j: int) -> True:"""map: 表示迷宫地图(i, j): 老鼠的起始位置map[i][j] = 0: 表示该位置没有走过map[i][j] = 1: 表示该位置是墙(走不了)map[i][j] = 2: 表示该位置是通路(可以走)map[i][j] = 3: 表示这个位置是死路上的一个节点(走不了)寻路策略:下 -> 右 -> 上 -> 左map[6][5] = 2 表示走到了终点(终点位置为(6,5))"""if self.map[6][5] == 2:return Trueelse:if self.map[i][j] == 0:# 假设可以走通,先设为2self.map[i][j] = 2if self.find_way(i + 1, j):  # 向下走return Trueelif self.find_way(i, j + 1):  # 向右走return Trueelif self.find_way(i - 1, j):  # 向上走return Trueelif self.find_way(i, j - 1):  # 向左走return Trueelse:  # 死路,走不通,设为3self.map[i][j] = 3return Falseelse:  # self.map[i][j] == 1,2,3 ,都表示走不通或已走过return Falsemg = MiGong()
mg.find_way(1, 1)
mg.print_map()

八皇后问题

思路分析

1、先将第一个皇后放在第一行第一列的位置
2、第二个皇后先放在第二行第一列的位置,然后判断是否冲突,如果冲突,则放在第二行第二列,继续判断,如果冲突,将第二个皇后放在第二行第三列... 依次把第二行所有列都尝试一遍,直到找到合适的一列,摆放第二个皇后
3、接着摆放第三个皇后,依次尝试放在第三行的第一列、第二列、第三列...直到找到一个合适的列摆放第三个皇后
4、同样的摆放第四个、第五个、第六个、第七个、第八个皇后,当第八个皇后也放到第八行的正确位置时,此时找到了一个正确解
5、当第八个皇后摆放好后,即第八个皇后第一次找到正确的位置后,开始回溯,查找其他摆放方法,即将第一个皇后放在第一行第一列这个位置上的所有正确解找出来
6、然后将第一个皇后放在第一行第二列的位置,重复 2-5 的步骤
7、依次将第一个皇后放在第一行第三、四、五、六、七、八列的位置,重复 2-5 的步骤,得到八皇后问题的全部解法(92)说明:理论上棋盘应该是一个二维数组,但是实际上可以通过算法,用一个一维数组解决,一维数组的下标对应行标,数组的元素对应列标,如 arr[8] = [0, 4, 7, 5, 2, 6, 1, 3] 表示:第一个皇后放在第 0 行 第 0 列的位置第二个皇后放在第 1 行 第 4 列的位置第三个皇后放在第 2 行 第 7 列的位置第四个皇后放在第 3 行 第 5 列的位置第五个皇后放在第 4 行 第 2 列的位置第六个皇后放在第 5 行 第 6 列的位置第七个皇后放在第 6 行 第 1 列的位置第八个皇后放在第 7 行 第 3 列的位置
即 arr[i] = val 表示第 i 个皇后摆放的位置是第 i 行 第 val 列

代码实现

class Queen:count = 0  # 全部的正确解def __init__(self, num: int):self.num = num  # 皇后的数量# 用列表表示一维数组,记录皇后摆放的正确位置self.arr = []# 初始化数组for i in range(num):self.arr.append(-1)def check_position(self, n: int) -> bool:"""摆放第 n 个皇后在某个位置时,判断是否与前面的 n-1 皇后产生冲突,不冲突返回Truen 从 0 开始"""for i in range(n):# arr[i] = val 表示第 i 个皇后摆放的位置是第 i 行 第 val 列if self.arr[i] == self.arr[n]:  # 有两个皇后在同一列return False# if n - i == self.arr[n] - self.arr[i]:  # 有两个皇后在正对角线上#     # 正对角线判断:x2 - x1 == y2 - y1#     # (x1, y1) = (i, self.arr[i])#     # (x2, y2) = (n, self.arr[n])#     return False# if n - i == self.arr[i] - self.arr[n]:  # 有两个皇后在反对角线上#     # 反对角线上判断:x2 - x1 == y1 - y2#     # (x1, y1) = (i, self.arr[i])#     # (x2, y2) = (n, self.arr[n])#     return False# 合并在一起写if abs(n - i) == abs(self.arr[n] - self.arr[i]):  # 有两个皇后在对角线上return Falsereturn Truedef place_queen(self, n: int):"""放置第 n 个皇后,n 从0开始"""if n == self.num:  # 全部皇后已经放完,得到一个正确解self.count += 1print(f'第{self.count}种的解法为{self.arr}')return# 从第 n 行的第一列开始,依次尝试放置这第 n 个皇后,# 看哪个位置可以放,即不会与前面的 n-1 个皇后产生冲突for i in range(self.num):  # i 表示列数self.arr[n] = i  # 把第 n 个皇后放置在第 n 行第 i 列# 检查把第 n 个皇后放置在第 n 行第 i 列后是否与前面的 n-1 个皇后产生冲突if self.check_position(n):  # 不产生冲突# 如果不产生冲突,则确定了该皇后的放置位置,则开始放置下一个皇后self.place_queen(n + 1)# 如果冲突,标明第 n 行的第 i 列不能放,继续尝试第 i+1 列def print_arr(self):"""打印数组"""for i in self.arr:print(i, end=' ')print()q = Queen(8)
q.place_queen(0)  # 从第一个皇后开始,从 0 开始
print('八皇后的全部解法有%s种' % q.count)

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

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

相关文章

pcie 总结

用户空间pci 常用命令 lspci 查看所有pci 设备 lspci -t 树形查看所有设备 lspci -s 00:1f.6 -vvv 查看某个设备所有信息 lspci -s 00:1f.6 -vvv -xxx 增加16进制看看 sudo cat /proc/iomen | grep PCI 查看所有地址映射 如何确定pcie io空间 内存空间大小 (1)读取出基地址…

什么是RPA机器人?RPA机器人能做什么?RPA机器人的应用场景

什么是RPA机器人? RPA机器人是一种使用软件机器人来模拟和执行人类操作的技术。RPA代表Robotic Process Automation(机器人流程自动化)。它是一种自动化技术,可以使用预定规则和预定流程来执行重复性、繁琐或规定任务的工作。 RP…

[论文笔记] Gunrock: A High-Performance Graph Processing Library on the GPU

Gunrock: A High-Performance Graph Processing Library on the GPU Gunrock: GPU 上的高性能图处理库 [Paper] [Code] PPoPP’16 摘要 Gunrock, 针对 GPU 的高层次批量同步图处理系统. 采用了一种新方法抽象 GPU 图分析: 实现了以数据为中心(data-centric)的抽象, 以在结点…

机房运维管理软件不知道用哪个好?

云顷网络还原系统V7.0是一款专业的机房运维管理产品,基于局域网络环境,针对中高端机房中电脑运维管理需求所设计开发的。网络还原系统软件通过全面的规划和设计,遵从机房部署、使用到维护阶段化使用方式,通过极速网络同传/增量对拷…

智能电话机器人的出现,能够解决哪些问题?

经济的繁荣与高速的发展,使得电销这个方式快速地融合在房地产与金融投资等大部分行业上。在电销人员与客户的沟通上,难免会出现很多问题,毕竟所面对的客户都是各行各业,他们有着不同的经历和身份。 对于时常需要处理客户投诉、安…

2023数模国赛C 题 蔬菜类商品的自动定价与补货决策-完整版创新多思路详解(含代码)

题目简评:看下来C题是三道题目里简单一些的,考察的点比较综合,偏数据分析。涉及预测模型和运筹优化(线性规划),还设了一问开放型问题,适合新手入门,发挥空间大。 题目分析与思路: 背景&#x…

MJ绘制「酱香拿铁」可爱壁纸;LLM产品团队招聘预告;FlowGPT提示词大赛第3季;台大深度学习音乐分析与生成最新课程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🔥 蹭「酱香拿铁」热点的Midjouney绘图创意,好可爱的手机壁纸 小红书作者 美学孤诣 使用 Midjourney 制作了「上个茅班」的手…

Emgu调用摄像头

1,安装EMgu 2,调用摄像头 public FaceLoad(){InitializeComponent();try{capture new Capture();capture.Start();//摄像头开始工作capture.ImageGrabbed frameProcess;//实时获取图像}catch (NullReferenceException excpt){//MessageBox.Show(excpt.Message);}}…

原生JavaScript+PHP多图上传实现

摘要 很多场景下需要选择多张图片上传&#xff0c;或者是批量上传以提高效率&#xff0c;多图上传的需求自然就比较多了&#xff0c;本文使用最简单的XMLHttpRequest异步上传图片。 界面 上传示例 代码 index.html <!DOCTYPE html> <html><head><titl…

【C++ • STL】一文带你走进string

文章目录 一、STL简介二、标准库中的string类三、string类的常用接口说明2.1 string类对象的常见构造2.2 string类对象的访问及遍历操作2.2.1 元素访问2.2.2 迭代器 2.3 string类对象的容量操作2.4 string类对象的修改操作2.5 string类非成员函数 四、总结 ヾ(๑╹◡╹)&#x…

Docker 的分层文件系统

1 分层文件系统 UnionFS 联合文件系统 bootfs&#xff1a;boot file systemrootfs&#xff1a;root file system 分层文件系统 Docker镜像都是只读的&#xff0c;当容器启动时&#xff0c;一个新的可写层被加到镜像的顶部&#xff0c;这一层就是我们通常说的容器层&#xf…

2023高教杯数学建模1:ABC题目+初步想法

2023 ABC题目初步想法 写在最前面A题&#xff1a;定日镜场的优化设计问题1&#xff1a;建模将其抽象为数学公式问题2&#xff1a;固定部分参数&#xff0c;约束条件下的局部最优化问题可尝试方法 问题3&#xff1a;约束条件下的局部最优化问题附录&#xff1a;相关计算公式参考…

LeetCode 1004.最大连续1的个数

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 硬往题目介绍上边去想的话其实非常困难&#xff0c;如果换种方式思考就会简单许多。 若我们将思想转化为&#xff0c;找出最长的子串(里面含有的0的数量最大为k)&#xff0c;然后返…

ipad触控笔有必要买原装吗?开学季ipad2023手写笔推荐

随着开学新学期的开始了&#xff0c;而平板电脑也开始在学校里流行了起来&#xff0c;这也给学生们带来了更多的便利。而苹果的原装电容笔&#xff0c;尽管功能很强&#xff0c;但是因为它的价格比较贵&#xff0c;要是你仅仅只是用来做学习和记录笔记的话&#xff0c;所以在国…

结构方程模型SEM、路径分析房价和犯罪率数据、预测智力影响因素可视化2案例...

原文链接&#xff1a;http://tecdat.cn/?p25044 在本文&#xff0c;我们将考虑观察/显示所有变量的模型&#xff0c;以及具有潜在变量的模型&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 1 简介 第一种有时称为“路径分析”&#xff0c;而后者有时称为“测…

这应该是最全的机器学习模型可解释性的综述

模型可解释性方面的研究&#xff0c;在近两年的科研会议上成为关注热点&#xff0c;因为大家不仅仅满足于模型的效果&#xff0c;更对模型效果的原因产生更多的思考&#xff0c;这样的思考有助于模型和特征的优化&#xff0c;更能够帮助更好的理解模型本身和提升模型服务质量。…

【LeetCode-中等题】22. 括号生成

文章目录 题目方法一&#xff1a;递归&#xff1a;方法二&#xff1a;递归回溯 题目 方法一&#xff1a;递归&#xff1a; 递归入口 空子结果集&#xff0c;左括号数目&#xff08;初始为0&#xff09;&#xff0c;右括号数目&#xff08;初始为0&#xff09; 递归出口 若左括…

【数字通信原理】笔记(持续更新ing)

通信原理学习笔记&#xff0c;课程见b站: 由于教材不同&#xff0c;我们的课程使用的是《数字通信原理》主编:李白萍 版本&#xff0c;因此此笔记以我们的教材为主整理up主的笔记。 详情见:通信原理 文章目录 第一章 绪论1. 通信的基本概念2. 信息的量度3. 通信系统的性能指标 …

用C语言实现牛顿摆控制台动画

题目 用C语言实现牛顿摆动画&#xff0c;模拟小球的运动&#xff0c;如图所示 拆解 通过控制台API定位输出小球运动的只是2边小球&#xff0c;中间小球不运动&#xff0c;只需要固定位置输出左边小球上升下降时&#xff0c;X、Y轴增量一致。右边小球上升下降时&#xff0c;X、…

了解静电消除器离子风嘴的作用

离子风嘴在工业用途中很广泛。属于用压缩气系列的除静电的一种设备。具有安装简单、性能稳定、风速强劲、除静电迅速的特点。 离子风嘴可以产生许多的带着有正电荷负电荷的气体&#xff0c;被压缩气吹出&#xff0c;可以把设备上带的电荷中和掉。当设备表面上带有的电荷为负电荷…