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爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
python实现在字符串中查找子字符串的方法
Jul 11 Python
Python 中 list 的各项操作技巧
Apr 13 Python
Python打印输出数组中全部元素
Mar 13 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
Python处理session的方法整理
Aug 29 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
Python 静态方法和类方法实例分析
Nov 21 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
python map比for循环快在哪
Sep 21 Python
Python eval函数介绍及用法
Nov 09 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 foreach、while性能比较
2009/10/15 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[14:51]DOTA2 HEROS教学视频教你分分钟做大人-卓尔游侠
2014/06/13 DOTA
[02:04]2014DOTA2国际邀请赛 DK一个时代的落幕
2014/07/21 DOTA
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
python实现发送邮件功能
2017/07/22 Python
Python实现找出数组中第2大数字的方法示例
2018/03/26 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
英国领先的电子、技术和办公用品购物网站:Ebuyer
2018/04/04 全球购物
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
单位未婚证明范本
2014/01/18 职场文书
2014年检验员工作总结
2014/11/19 职场文书
授权委托书
2015/01/28 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
消防隐患整改通知书
2015/04/22 职场文书
九年级语文教学反思
2016/03/03 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
vue项目支付功能代码详解
2022/02/18 Vue.js