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远程登录代码
Apr 29 Python
python实现ip查询示例
Mar 26 Python
python修改操作系统时间的方法
May 18 Python
Python易忽视知识点小结
May 25 Python
Python多线程下载文件的方法
Jul 10 Python
Python 实现简单的电话本功能
Aug 09 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
python 获取文件下所有文件或目录os.walk()的实例
Apr 23 Python
通过python将大量文件按修改时间分类的方法
Oct 17 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
Python传递参数的多种方式(小结)
Sep 18 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
Jun 10 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创建Cookie数组的详解
2013/07/03 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
PHP中COOKIES使用示例
2015/07/26 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
dojo 之基础篇
2007/03/24 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
CSS3实现动态背景登录框的代码
2015/07/28 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
2017/03/04 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
python itchat实现微信自动回复的示例代码
2017/08/14 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
flask开启多线程的具体方法
2020/08/02 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
解除劳动合同协议书
2014/04/14 职场文书
趣味运动会广播稿
2014/09/13 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
劳资员岗位职责
2015/02/13 职场文书
感恩主题班会教案
2015/08/12 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书
多人股份制合作协议书
2016/03/19 职场文书
2019年作为一名实习生的述职报告
2019/09/29 职场文书
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
2021/08/30 Python
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python