全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Python使用回溯法子集树模板解决迷宫问题示例

本文实例讲述了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小时内与您取得联系。