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之数据类型总结
Sep 24 Python
python中私有函数调用方法解密
Apr 29 Python
Python字符串格式化的方法(两种)
Sep 19 Python
Python变量赋值的秘密分享
Apr 03 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Python设计模式之代理模式实例详解
Jan 19 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
Django框架models使用group by详解
Mar 11 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
Mar 30 Python
python爬取微博评论的实例讲解
Jan 15 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 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
PHP5常用函数列表(分享)
2013/06/07 PHP
php过滤html中的其他网站链接的方法(域名白名单功能)
2014/04/24 PHP
PHP框架Laravel插件Pagination实现自定义分页
2020/04/22 PHP
PHP getName()函数讲解
2019/02/03 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
javascript 关闭IE6、IE7
2009/06/01 Javascript
js调用后台servlet方法实例
2013/06/09 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
Python连接phoenix的方法示例
2017/09/29 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
对python中Json与object转化的方法详解
2018/12/31 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
2020/04/30 Python
python中的unittest框架实例详解
2021/02/05 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
酒店总经理助理岗位职责
2014/02/01 职场文书
协议书范本
2014/04/23 职场文书
单位单身证明样本
2014/10/11 职场文书
整改报告格式
2014/11/06 职场文书
模范教师事迹材料
2014/12/16 职场文书
2014年小学教导处工作总结
2014/12/19 职场文书
期末个人总结范文
2015/02/13 职场文书
幼儿园辞职信
2015/05/13 职场文书
钢琴师观后感
2015/06/12 职场文书
学校食堂管理制度
2015/08/04 职场文书
Python 中的 copy()和deepcopy()
2021/11/07 Python
Apache SkyWalking 监控 MySQL Server 实战解析
2022/09/23 Servers