目录

1、走迷宫与回溯算法

2、迷宫设计栈扮演的角色

3、Python实现走迷宫


栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序。其实回溯算法也是人工智能的一环,通常又称试错(try and error)算法,早期设计的计算机象棋游戏、五子棋游戏,大都是使用回溯算法。

1、走迷宫与回溯算法

假设一个简单的迷宫图形如下图所示:

一个迷宫基本上由4种空格组成:

入口:迷宫的入口,笔者上图用绿色表示。通道:迷宫的通道,笔者上图用黄色表示。墙壁:迷宫的墙壁,不可通行,笔者上图用灰色表示。出口:迷宫的出口,笔者上图用蓝色表示。

在走迷宫时,可以上、下、左、右行走,如下图所示:

走迷宫时每次可以走一步,如果碰到墙壁不能穿越必须走其他方向。

第1步:假设目前位置在入口处,可以参考下图所示:

第2步:如果依照上、下、左、右原则,应该向上走,但是往上是墙壁,所以必须往下走,然后必须将走过的路标记,此例是用浅绿色标记,所以上述右图是在迷宫中的新位置,如下图所示:

第3步:接下来可以发现往上是走过的路,所以只能往下发(依据上、下、左、右原则,先不考虑左、右是墙壁),下方左图是新的迷宫位置,如下图所示:

第4步:接下来可以发现往上是走过的路,所以只能往下(依据上、下、左、右原则,先不考虑左、右),下方右图是新的迷宫位置,如下图所示:

第5步:现在下、左、右皆是墙壁,所以回到前面走过的路,这一步就是回溯的关键,可参考下方左图,在此图中笔者将造成回溯的路另外标记,以防止再次造访,如下图所示:

第6步:现在上、下皆是走过的路,左边是墙壁,所以往右走,如下图所示:

第7步:接下来上、下是墙壁,左边是走过的路,所以往右走,如下图所示:

第8步:由于上方有路所以往上走,如下图所示:

第9步:由于上方有路所以往上走,如下图所示:

第10步:由于上、左、右皆是墙壁,所以回溯到前一个位置,如下图所示:

第11步:由于上、下是走过的路,左边是墙壁,所以往右走,如下图所示:

第12步:由于上、下、右是墙壁,所以回溯到先前位置,如下图所示:

第13步:由于左边是墙壁,所以回溯到先前走过的位置,如下图所示:

第14步:下方有通道,所以往下走,如下图所示:

第15步:上方是走过的位置,左方和下方是墙壁,所以往右走,如下图所示:

2、迷宫设计栈扮演的角色

上面介绍到,在第2步使用浅绿色标记走过的路,真实程序设计可以用栈存储走过的路。

第5步使用回溯算法,所谓的回溯就是走以前走过的路,因为是将走过的路使用栈(stack)存储,基于后进先出原则,可以pop出前一步路径,这也是回溯的重点。当走完第4步时,

迷宫与栈图形如下所示:

上述迷宫位置使用程序语言的(row,column)标记,所以第5步要使用回溯时,可以从栈pop出(3,1)坐标,回到(3,1)位置,结果如下所示所示:

3、Python实现走迷宫

使用Python设计走迷宫可以使用二维的列表,0代表通道、1代表墙壁,至于起点和终点也可以用0代表。

使用上述第一部分的迷宫实例,其中所经过的路径用2表示,经过会造成无路可走的路径用3表示。程序第41行前2个参数是迷宫的入口,后2个参数是迷宫的出口,实现代码如下所示:

# ch11_1.py
from pprint import pprint
maze = [                                    # 迷宫地图[1, 1, 1, 1, 1, 1],[1, 0, 1, 0, 1, 1],[1, 0, 1, 0, 0, 1],[1, 0, 0, 0, 1, 1],[1, 0, 1, 0, 0, 1],[1, 1, 1, 1, 1, 1]]
directions = [                              # 使用列表设计走迷宫方向lambda x, y: (x-1, y),        # 往上走lambda x, y: (x+1, y),        # 往下走lambda x, y: (x, y-1),        # 往左走lambda x, y: (x, y+1),        # 往右走       ]
def maze_solve(x, y, goal_x, goal_y):''' 解迷宫程序 x, y是迷宫入口, goal_x, goal_y是迷宫出口'''maze[x][y] = 2stack = []                              # 建立路径栈stack.append((x, y))                    # 将路径push入栈print('迷宫开始')while (len(stack) > 0):cur = stack[-1]                     # 目前位置if cur[0] == goal_x and cur[1] == goal_y:print('抵达出口')return True                     # 抵达出口返回True        for dir in directions:              # 依上, 下, 左, 右优先次序走此迷宫next = dir(cur[0], cur[1])if maze[next[0]][next[1]] == 0: # 如果是通道可以走stack.append(next)maze[next[0]][next[1]] = 2  # 用2标记走过的路breakelse:                               # 如果进入死路, 则回溯maze[cur[0]][cur[1]] = 3        # 标记死路stack.pop()                     # 回溯 else:print("没有路径")return Falsemaze_solve(1, 1, 4, 4)
pprint(maze)                                # 跳行显示元素

运行效果如下所示:


项目源码下载:用栈、回溯算法设计迷宫程序

本文来源:清华计算机学堂

用栈、回溯算法设计迷宫程序相关推荐

  1. JAVA算法:走迷宫回溯算法设计(JAVA版本)

    JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = {                 {0, 1, 0, 0, 0},                 {0, ...

  2. 编译原理实验报告_任意给定一个正规式 r (包括连接、或、闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N 。

    任意给定一个正规式 r (包括连接.或.闭包运算),根据 Thompson算法设计一个程序,生成与该正规式等价的 NFA N . 百度网盘下载 传送门 提取码:bzjn

  3. 回溯算法解决迷宫问题

    文章目录 前言 一.回溯法 二.算法应用--迷宫问题 1.问题描述 2.解题思路 三.Java代码实现 前言 本文介绍一种经典算法--回溯法,可作为迷宫问题的一种解法. 一.回溯法 回溯是一种算法思想 ...

  4. 算法分析与设计-实验四 回溯算法设计

    文章目录 1.0-1背包问题 2.旅行售货员问题 3.图的m着色问题 一.实验目的: 掌握用回溯法解题的算法框架:根据回溯法解决实际问题. 二.实验所用仪器及环境 Windows 7 以上操作系统,P ...

  5. C语言与算法设计技能培训

    C 语言与算法设计技能培训 1 .用C语言实现下列各种排序:冒泡排序.选择排序.快速排序冒泡排序函数如下: /*n表示待排序的数据的个数*/ #define n 10 void maopao(int ...

  6. 回溯算法 与 深度优先遍历对比

    回溯算法 与 深度优先遍历对比 回溯算法与深度优先遍历 理解 搜索与遍历 与动态规划的区别 共同点 不同点 从全排列问题开始理解回溯算法 设计状态变量 代码实现 参考代码 1 (错误代码): 修改的部 ...

  7. 计算机导论算法设计,计算机导论精品PPT-第五章 算法与程序设计.ppt

    <计算机导论精品PPT-第五章 算法与程序设计.ppt>由会员分享,可在线阅读,更多相关<计算机导论精品PPT-第五章 算法与程序设计.ppt(52页珍藏版)>请在人人文库网上 ...

  8. 算法设计与分析期末总结

    0000前言:基本是为了我自己看的一些我容易忘记的东西,为考试作准备把,主要使后半部分的知识,前半部分请看算法设计与分析阶段考总结 第五章 回溯算法是一种系统地搜索问题的解的方法.某个问题的所有可能解 ...

  9. 项目经验之谈--驱动崩溃分析之栈回溯技术与反汇编

    1.序言 驱动往往是芯片厂商提供的,而且是不开源的. 一旦崩溃很难查找原因,当然办法是有的,比如内核为此也提供栈回溯技术(低版本的好像没有实现)来定位分析驱动问题.再不济也可以反汇编ko文件. 2.栈 ...

最新文章

  1. Python Module — WSME
  2. 1.22 Lambda表达式的3种简写方式
  3. Underscore.js常用方法介绍
  4. vs2010跟vs2008比较增加了哪些功能
  5. 是时候考虑让你的Spark跑在K8S上了
  6. app_process执行java文件
  7. 纯js油猴插件版GUI页面助手
  8. iphone6连接电脑后计算机不显示器,iPhone6怎么无故显示屏不亮了
  9. git合并——衍合于挑拣(cherry-pick)——只合并某个commit
  10. 【DaVinci Developer专题】-32-Mode(Switch) Declaration Group中Alphabetic和Explicit的区别
  11. 学习pytorch中归一化transforms.Normalize
  12. 重庆涪陵创新计算机职业学校文艺表演,涪陵信息技术学校2017年元旦文艺汇演...
  13. linux服务器双网卡配置,linux 关于主机服务器双网卡bond配置
  14. 高分辨率屏幕下,软件界面分辨率过低的解决办法(经验贴汇总+自身实践)
  15. QT上设置背景图不影响子控件以及按钮控件的透明化
  16. 给予员工更好的激励- - 俞敏洪
  17. 电脑连不上网显示dns服务器不可用,电脑连不上网疑难解答显示DNS服务器可能不可用该怎么办...
  18. 人眼识别与机器识别的联系_机器可以识别笑话吗
  19. 你是切身体会到了PHP使用体验差;还是因为就业前景等因素让你觉得PHP很差?
  20. 有没有支持P2P架构的直播技术?

热门文章

  1. Python:机器视觉与Tesseract介绍
  2. python 把int类型转bytes以及把bytes 转int 类型(使用方法to_bytes ,from_byte, struct)
  3. TypeError: ord() expected string of length 1, but int found
  4. ERROR: Failed to resolve: com.android.support:appcompat-v7:29.0.0
  5. Rendering failed with a known bug ,Please try a rebuild
  6. redis 安装启动及设置密码windows
  7. 2022-2028年中国TPE弹性体行业市场研究及前瞻分析报告
  8. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)
  9. 数据结构-线性表的顺序结构
  10. 第十九章——使用资源调控器管理资源(2)——使用T-SQL配置资源调控器