本文实例讲述了Python使用回溯法解决迷宫问题。分享给大家供大家参考,具体如下:

问题
给定一个迷宫,入口已知。问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。为方便起见,用1将迷宫围起来避免边界问题。
分析
考虑到左、右是相对的,因此修改为:北、东北、东、东南、南、西南、西、西北八个方向。在任意一格内,有8个方向可以选择,亦即8种状态可选。因此从入口格子开始,每进入一格都要遍历这8种状态。
显然,可以套用回溯法的子集树模板。
注意,解的长度是不固定的。
代码
# 迷宫(1是墙,0是通路)
maze = [[1,1,1,1,1,1,1,1,1,1],
[0,0,1,0,1,1,1,1,0,1],
[1,1,0,1,0,1,1,0,1,1],
[1,0,1,1,1,0,0,1,1,1],
[1,1,1,0,0,1,1,0,1,1],
[1,1,0,1,1,1,1,1,0,1],
[1,0,1,0,0,1,1,1,1,0],
[1,1,1,1,1,0,1,1,1,1]]
m, n = 8, 10 # 8行,10列
entry = (1,0) # 迷宫入口
path = [entry] # 一个解(路径)
paths = [] # 一组解
# 移动的方向(顺时针8个:N, EN, E, ES, S, WS, W, WN)
directions = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]
# 冲突检测
def conflict(nx, ny):
global m,n,maze
# 是否在迷宫中,以及是否可通行
if 0 <= nx < m and 0 <= ny < n and maze[nx][ny]==0:
return False
return True
# 套用子集树模板
def walk(x, y): # 到达(x,y)格子
global entry,m,n,maze,path,paths,directions
if (x,y) != entry and (x % (m-1) ==0 or y % (n-1) == 0): # 出口
#print(path)
paths.append(path[:]) # 直接保存,未做最优化
else:
for d in directions: # 遍历8个方向(亦即8个状态)
nx, ny = x+d[0], y+d[1]
path.append((nx,ny)) # 保存,新坐标入栈
if not conflict(nx, ny): # 剪枝
maze[nx][ny] = 2 # 标记,已访问(奇怪,此两句只能放在if区块内!)
walk(nx, ny)
maze[nx][ny] = 0 # 回溯,恢复
path.pop() # 回溯,出栈
# 解的可视化(根据一个解x,复原迷宫路径,'2'表示通路)
def show(path):
global maze
import pprint, copy
maze2 = copy.deepcopy(maze)
for p in path:
maze2[p[0]][p[1]] = 2 # 通路
pprint.pprint(maze) # 原迷宫
print()
pprint.pprint(maze2) # 带通路的迷宫
# 测试
walk(1,0)
print(paths[-1], '\n') # 看看最后一条路径
show(paths[-1])
效果图
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
# Python
# 回溯法
# 子集树模板
# 解决
# 迷宫问题
# Python解决走迷宫问题算法示例
# Python基于递归算法实现的走迷宫问题
# Python 实现递归法解决迷宫问题的示例代码
# python迷宫问题深度优先遍历实例
# 使用python求解迷宫问题的三种实现方法
# 遍历
# 亦即
# 进阶
# 放在
# 相关内容
# 都要
# 感兴趣
# 数据结构
# 给大家
# 考虑到
# 可选
# 两句
# 若有
# 可以选择
# 更多关于
# 所述
# 程序设计
# 使用技巧
# 可走
# 未做
相关文章:
北京制作网站的公司,北京铁路集团官方网站?
深圳网站制作的公司有哪些,dido官方网站?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何快速生成ASP一键建站模板并优化安全性?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站之星安装路径如何正确选择及配置?
建站主机类型有哪些?如何正确选型
家庭建站与云服务器建站,如何选择更优?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
css网站制作参考文献有哪些,易聊怎么注册?
建站之星在线客服如何快速接入解答?
图册素材网站设计制作软件,图册的导出方式有几种?
如何在阿里云购买域名并搭建网站?
北京专业网站制作设计师招聘,北京白云观官方网站?
宝塔新建站点为何无法访问?如何排查?
如何高效完成自助建站业务培训?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何访问已购建站主机并解决登录问题?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
Thinkphp 中 distinct 的用法解析
建站之星2.7模板:企业网站建设与h5定制设计专题
XML的“混合内容”是什么 怎么用DTD或XSD定义
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
建站org新手必看:2024最新搭建流程与模板选择技巧
如何选购建站域名与空间?自助平台全解析
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
如何快速生成专业多端适配建站电话?
如何快速生成凡客建站的专业级图册?
安徽网站建设与外贸建站服务专业定制方案
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
建站主机无法访问?如何排查域名与服务器问题
网站制作企业,网站的banner和导航栏是指什么?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
如何用低价快速搭建高质量网站?
建站之星3.0如何解决常见操作问题?
如何快速生成橙子建站落地页链接?
建站之星ASP如何实现CMS高效搭建与安全管理?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
建站之星如何助力网站排名飙升?揭秘高效技巧
如何彻底卸载建站之星软件?
如何通过VPS建站实现广告与增值服务盈利?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
如何在IIS中新建站点并解决端口绑定冲突?
*请认真填写需求信息,我们会在24小时内与您取得联系。