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字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
python去除字符串中的换行符
Oct 11 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
想学python 这5本书籍你必看!
Dec 11 Python
python 格式化输出百分号的方法
Jan 20 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
Django 实现Admin自动填充当前用户的示例代码
Nov 18 Python
Python生态圈图像格式转换问题(推荐)
Dec 02 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
Python根据指定文件生成XML的方法
Jun 29 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 Python
Python实现信息管理系统
Jun 05 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
完美解决thinkphp验证码出错无法显示的方法
2014/12/09 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
jqTransform form表单美化插件使用方法
2012/07/05 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
jQuery树形控件zTree使用小结
2016/08/02 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
Angular4开发解决跨域问题详解
2017/08/28 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
nodejs 递归拷贝、读取目录下所有文件和目录
2019/07/18 NodeJs
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
Python计算已经过去多少个周末的方法
2015/07/25 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
python学习基础之循环import及import过程
2018/04/22 Python
python 寻找list中最大元素对应的索引方法
2018/06/28 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Python正则表达式学习小例子
2020/03/03 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
Python自动化xpath实现自动抢票抢货
2020/09/19 Python
python 装饰器重要在哪
2021/02/14 Python
优秀管理者获奖感言
2014/02/17 职场文书
学生评语大全
2014/04/18 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
2015感人爱情寄语
2015/02/26 职场文书
工作调动申请报告
2015/05/18 职场文书
同意落户证明
2015/06/19 职场文书