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逐行读取文件内容的三种方法
Jan 20 Python
Python中title()方法的使用简介
May 20 Python
Python快速查找list中相同部分的方法
Jun 27 Python
Python实现注册、登录小程序功能
Sep 21 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
Django中提示消息messages的设置方式
Nov 15 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
python实现图像外边界跟踪操作
Jul 13 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 Python
pandas中pd.groupby()的用法详解
Jun 16 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生成静态页
2006/11/25 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
javascript for循环设法提高性能
2010/02/24 Javascript
Js+Flash实现访问剪切板操作
2012/11/20 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
asm.js使用示例代码
2013/11/28 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
Javascript实现汉字和拼音互转的终极方案
2016/10/19 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
React组件refs的使用详解
2018/02/09 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
详解Python中的type()方法的使用
2015/05/21 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
详解Python的数据库操作(pymysql)
2019/04/04 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
python属于跨平台语言码
2020/06/09 Python
Python+Appium实现自动化清理微信僵尸好友的方法
2021/02/04 Python
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
英文版银行求职信
2013/10/09 职场文书
公司合作协议书范本
2014/04/18 职场文书
活动宣传策划方案
2014/05/23 职场文书
节能减耗标语
2014/06/21 职场文书
美术课外活动总结
2014/07/08 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
MySQL千万级数据表的优化实战记录
2021/08/04 MySQL
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫