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


Posted in Python onSeptember 01, 2017

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

问题

给定一个迷宫,入口已知。问是否有路径从入口到出口,若有则输出一条这样的路径。注意移动可以从上、下、左、右、上左、上右、下左、下右八个方向进行。迷宫输入0表示可走,输入1表示墙。为方便起见,用1将迷宫围起来避免边界问题。

分析

考虑到左、右是相对的,因此修改为:北、东北、东、东南、南、西南、西、西北八个方向。在任意一格内,有8个方向可以选择,亦即8种状态可选。因此从入口格子开始,每进入一格都要遍历这8种状态。

显然,可以套用回溯法的子集树模板。

注意,解的长度是不固定的。

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

代码

# 迷宫(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 lxml模块安装教程
Jun 02 Python
Tensorflow简单验证码识别应用
May 25 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
python如何对实例属性进行类型检查
Mar 20 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
May 23 Python
python cv2.resize函数high和width注意事项说明
Jul 05 Python
python 下载m3u8视频的示例代码
Nov 11 Python
Django自带用户认证系统使用方法解析
Nov 12 Python
Python3爬虫ChromeDriver的安装实例
Feb 06 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 #Python
Python3.x对JSON的一些操作示例
Sep 01 #Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 #Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 #Python
python requests 使用快速入门
Aug 31 #Python
如何高效使用Python字典的方法详解
Aug 31 #Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 #Python
You might like
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
几款免费开源的不用数据库的php的cms
2010/12/19 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
用显卡加速,轻松把笔记本打造成取暖器的办法!
2013/04/17 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
jquery常用操作小结
2014/07/21 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
JavaScript引用类型Function实例详解
2018/08/09 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
vue实现标签云效果的示例
2020/11/09 Javascript
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python3库numpy数组属性的查看方法
2018/04/17 Python
对python的unittest架构公共参数token提取方法详解
2018/12/17 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
教师实习自我鉴定
2013/12/18 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
学校教研活动总结
2014/07/02 职场文书
大学生党校培训心得体会
2014/09/11 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
委托公证书格式
2015/01/26 职场文书
装修安全责任协议书
2016/03/22 职场文书
如何用JavaScipt测网速
2021/05/09 Javascript