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解析xml文件操作实例
Oct 05 Python
python中base64加密解密方法实例分析
May 16 Python
Python保存MongoDB上的文件到本地的方法
Mar 16 Python
利用Python脚本实现ping百度和google的方法
Jan 24 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
python多进程使用及线程池的使用方法代码详解
Oct 24 Python
详解python 降级到3.6终极解决方案
Feb 06 Python
python numpy生成等差数列、等比数列的实例
Feb 25 Python
Python如何省略括号方法详解
Mar 21 Python
Mysql数据库反向生成Django里面的models指令方式
May 18 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 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/04/20 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
PHP防盗链代码实例
2014/08/27 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
jquery 分页控件实现代码
2009/11/30 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
Javascript实现单张图片浏览
2014/12/18 Javascript
EasyUI中实现form表单提交的示例分享
2015/03/01 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
python web基础之加载静态文件实例
2018/03/20 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python学习笔记之Break和Continue用法分析
2019/08/14 Python
a标签下载链接的简单实现
2016/09/13 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
市场营销管理制度
2014/01/29 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
静心口服夜广告词
2014/03/20 职场文书
北京奥运会主题口号
2014/06/13 职场文书
物理教育专业求职信
2014/06/25 职场文书
春风化雨观后感
2015/06/11 职场文书
企业愿景口号
2015/12/25 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers