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 查找字符串是否存在实例详解
Jan 20 Python
python flask 多对多表查询功能
Jun 25 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
python执行精确的小数计算方法
Jan 21 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
Django如何使用第三方服务发送电子邮件
Aug 14 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
python数据抓取3种方法总结
Feb 07 Python
python - timeit 时间模块
Apr 06 Python
Python可变集合和不可变集合的构造方法大全
Dec 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式
2014/05/04 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
模拟select的代码
2011/10/19 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
详解cordova打包成webapp的方法
2017/10/18 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
vue-socket.io跨域问题有效解决方法
2020/02/11 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
python监控网卡流量并使用graphite绘图的示例
2014/04/27 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
django+mysql的使用示例
2018/11/23 Python
django多个APP的urls设置方法(views重复问题解决)
2019/07/19 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
解析Python3中的Import
2019/10/13 Python
Python ATM功能实现代码实例
2020/03/19 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
HTML5 文件域+FileReader 分段读取文件并上传到服务器
2017/10/23 HTML / CSS
英国奢华护肤、美容和Spa品牌:Temple Spa
2019/11/02 全球购物
经贸韩语专业大学生职业规划
2014/02/14 职场文书
2015年社会实践个人总结
2015/03/06 职场文书
好段摘抄大全(48句)
2019/08/08 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL