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实现微信公众平台自定义菜单实例
Mar 20 Python
你所不知道的Python奇技淫巧13招【实用】
Dec 14 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
python实现textrank关键词提取
Jun 22 Python
PyQt5笔记之弹出窗口大全
Jun 20 Python
PyQt5响应回车事件的方法
Jun 25 Python
keras tensorflow 实现在python下多进程运行
Feb 06 Python
Python pandas如何向excel添加数据
May 22 Python
python中常见错误及解决方法
Jun 21 Python
python如何做代码性能分析
Apr 26 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 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/05/01 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
Javascript模板技术
2007/04/27 Javascript
jQuery 获取和设置select下拉框的值实现代码
2013/11/08 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
微信小程序遇到修改数据后页面不渲染的问题解决
2017/03/09 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
Node.js Stream ondata触发时机与顺序的探索
2019/03/08 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
用Python实现斐波那契(Fibonacci)函数
2016/03/25 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
pandas 空数据处理方法详解
2019/11/02 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
某公司的.net工程师面试题笔试题
2013/11/22 面试题
new修饰符是起什么作用
2015/06/28 面试题
安全标准化汇报材料
2014/02/03 职场文书
新手上路标语
2014/06/20 职场文书
四风问题查摆材料
2014/08/25 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
九华山导游词
2015/02/03 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
KTV员工管理制度
2015/08/06 职场文书
企业愿景口号
2015/12/25 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android