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 26 Python
python使用post提交数据到远程url的方法
Apr 29 Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 Python
Python数据类型详解(四)字典:dict
May 12 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
不可错过的十本Python好书
Jul 06 Python
python3+PyQt5泛型委托详解
Apr 24 Python
python抓取网站的图片并下载到本地的方法
May 22 Python
python实现kmp算法的实例代码
Apr 03 Python
Python获取数据库数据并保存在excel表格中的方法
Jun 12 Python
详解python常用命令行选项与环境变量
Feb 20 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
玛琪朵 Macchiato
2021/03/03 咖啡文化
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
利用jQuery实现可以编辑的表格
2014/05/26 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
Jquery使用css方法改变样式实例
2015/05/18 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
python之yield表达式学习
2014/09/02 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Django中的Model操作表的实现
2018/07/24 Python
Python 比较文本相似性的方法(difflib,Levenshtein)
2018/10/15 Python
python列表list保留顺序去重的实例
2018/12/14 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
python安装pywin32clipboard的操作方法
2019/01/24 Python
对numpy下的轴交换transpose和swapaxes的示例解读
2019/06/26 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
Python sorted排序方法如何实现
2020/03/31 Python
UGG澳洲官网:UGG Australia
2018/04/26 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
班级团队活动方案
2014/08/14 职场文书
党员自我剖析材料
2014/08/31 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
党员民主评议总结
2014/10/20 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
2016年国庆节宣传标语
2015/11/25 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书