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 相关文章推荐
Python3 循环语句(for、while、break、range等)
Nov 20 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Tensorflow实现AlexNet卷积神经网络及运算时间评测
May 24 Python
python使用RNN实现文本分类
May 24 Python
分享vim python缩进等一些配置
Jul 02 Python
python实现贪吃蛇小游戏
Mar 21 Python
深入了解Django中间件及其方法
Jul 26 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
django 做 migrate 时 表已存在的处理方法
Aug 31 Python
如何利用python 读取配置文件
Jan 06 Python
Django Paginator分页器的使用示例
Jun 23 Python
python和anaconda的区别
May 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
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
2012/09/13 PHP
浅谈php的优缺点
2015/07/14 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
PHP实现下载远程图片保存到本地的方法
2017/06/19 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
2018/05/02 PHP
JS关键字变色实现思路及代码
2013/02/21 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
javascript Slip.js实现整屏滑动的手机网页
2015/11/25 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
基于JavaScript实现动态创建表格和增加表格行数
2015/12/20 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
2018/09/15 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
python统计日志ip访问数的方法
2015/07/06 Python
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
Python使用sorted对字典的key或value排序
2018/11/15 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python logging.info在终端没输出的解决
2020/05/12 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
python安装读取grib库总结(推荐)
2020/06/24 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
纽约海:Sea New York
2018/11/04 全球购物
在阿尔卑斯山或希腊度过快乐假期:Alpine Elements
2019/12/28 全球购物
大学生学习党课思想汇报
2014/01/03 职场文书
出国签证在职证明
2014/01/16 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
化工操作工岗位职责
2014/04/29 职场文书
关于建议书的格式范文
2014/05/20 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
复兴之路观后感
2015/06/02 职场文书
使用pytorch实现线性回归
2021/04/11 Python
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
2021/06/26 Java/Android
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python