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 相关文章推荐
采用Psyco实现python执行速度提高到与编译语言一样的水平
Oct 11 Python
为python设置socket代理的方法
Jan 14 Python
详解Python中的__new__()方法的使用
Apr 09 Python
Python中如何获取类属性的列表
Dec 26 Python
Python实现计算圆周率π的值到任意位的方法示例
May 08 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
解决python3 urllib 链接中有中文的问题
Jul 16 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
python批量下载抖音视频
Jun 17 Python
使用Python将图片转正方形的两种方法实例代码详解
Apr 29 Python
Python日志处理模块logging用法解析
May 19 Python
如何在windows下安装配置python工具Ulipad
Oct 27 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
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
jquery json 实例代码
2010/12/02 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
JavaScript 变量作用域分析
2011/07/04 Javascript
深入理解JavaScript作用域和作用域链
2011/10/21 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
2016/12/02 Javascript
Vue.js第四天学习笔记(组件)
2016/12/02 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
详解 vue better-scroll滚动插件排坑
2018/02/08 Javascript
深入浅出理解JavaScript闭包的功能与用法
2018/08/01 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
2018/08/27 Javascript
vue鼠标悬停事件实例详解
2019/04/01 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
jQuery 动态粒子效果示例代码
2020/07/07 jQuery
Python使用pickle模块实现序列化功能示例
2018/07/13 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
史泰博(Staples)中国官方网站:办公用品一站式采购
2016/09/05 全球购物
五年级语文教学反思
2014/01/30 职场文书
九年级政治教学反思
2014/02/06 职场文书
一体化教学实施方案
2014/05/10 职场文书
代理人委托书
2014/09/16 职场文书
搞笑的爱情检讨书
2014/10/01 职场文书
教师作风建设剖析材料
2014/10/11 职场文书
民主评议党员工作总结
2014/10/20 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
老干部座谈会主持词
2015/07/03 职场文书
创业计划书详解
2019/07/19 职场文书
zabbix监控mysql的实例方法
2021/06/02 MySQL
pandas求平均数和中位数的方法实例
2021/08/04 Python