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根据区号生成手机号码的方法
Jul 08 Python
Python 的内置字符串方法小结
Mar 15 Python
python daemon守护进程实现
Aug 27 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
python3处理含有中文的url方法
May 10 Python
python操作redis方法总结
Jun 06 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
python numpy数组中的复制知识解析
Feb 03 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 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
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
php 类自动载入的方法
2015/06/03 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
swoole和websocket简单聊天室开发
2017/11/18 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
In Javascript Class, how to call the prototype method.(three method)
2007/01/09 Javascript
javascript五图轮播切换实用版
2012/08/17 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
Python multiprocessing.Manager介绍和实例(进程间共享数据)
2014/11/21 Python
python轻松实现代码编码格式转换
2015/03/26 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
Python实现登录接口的示例代码
2017/07/21 Python
Python AES加密实例解析
2018/01/18 Python
python简易远程控制单线程版
2018/06/20 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
python3实现小球转动抽奖小游戏
2020/04/15 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
本科毕业生的求职信范文
2013/11/20 职场文书
奥巴马演讲稿
2014/01/08 职场文书
财务担保书范文
2014/04/02 职场文书
求职教师自荐书
2014/06/19 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
2016年第29个世界无烟日宣传活动总结
2016/04/06 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
vmware虚拟机打不开vmx文件怎么办 ?vmware虚拟机vmx文件打开方法
2022/04/08 数码科技