用栈、回溯算法设计迷宫程序

简介: 用栈、回溯算法设计迷宫程序

目录

1、走迷宫与回溯算法


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


3、Python实现走迷宫


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


1、走迷宫与回溯算法

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


image.png


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


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

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


image.png


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


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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


image.png


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

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


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


迷宫与栈图形如下所示:


image.png


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


image.png


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] = 2
    stack = []                              # 建立路径栈
    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标记走过的路
                break
        else:                               # 如果进入死路, 则回溯
            maze[cur[0]][cur[1]] = 3        # 标记死路
            stack.pop()                     # 回溯 
    else:
        print("没有路径")
        return False
maze_solve(1, 1, 4, 4)
pprint(maze)                                # 跳行显示元素

运行效果如下所示:

image.png

相关文章
|
8月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
10月前
|
算法
回溯算法的基本思想
本节介绍回溯算法,通过图1中从A到K的路径查找示例,说明其与穷举法的异同。回溯算法通过“回退”机制高效试探各种路径,适用于决策、优化和枚举问题。
345 0
|
9月前
|
存储 算法 生物认证
基于Zhang-Suen算法的图像细化处理FPGA实现,包含testbench和matlab验证程序
本项目基于Zhang-Suen算法实现图像细化处理,支持FPGA与MATLAB双平台验证。通过对比,FPGA细化效果与MATLAB一致,可有效减少图像数据量,便于后续识别与矢量化处理。算法适用于字符识别、指纹识别等领域,配套完整仿真代码及操作说明。
|
12月前
|
PyTorch 算法框架/工具 C++
人工智能算法python程序运行环境安装步骤整理
本教程详细介绍Python与AI开发环境的配置步骤,涵盖软件下载、VS2017安装、Anaconda配置、PyCharm设置及组件安装等内容,适用于Windows系统,助你快速搭建开发环境。
|
11月前
|
存储 缓存 算法
什么是回溯算法
回溯算法是一种通过尝试所有可能路径寻找问题解的策略,采用深度优先搜索与状态重置机制。它适用于组合、排列、棋盘等需枚举所有可能解的问题,核心思想包括DFS遍历、剪枝优化与状态恢复。尽管时间复杂度较高,但通过合理剪枝可显著提升效率,是解决复杂搜索问题的重要方法。
625 0
|
算法 Java
算法系列之回溯算法求解数独及所有可能解
数独求解的核心算法是回溯算法。回溯算法是一种通过逐步构建解决方案并在遇到冲突时回退的算法。具体来说,我们尝试在空格中填入一个数字,然后递归地继续填充下一个空格。如果在某个步骤中发现无法继续填充,则回退到上一步并尝试其他数字。
761 11
算法系列之回溯算法求解数独及所有可能解
|
算法 数据可视化 Python
Python中利用遗传算法探索迷宫出路
本文探讨了如何利用Python和遗传算法解决迷宫问题。迷宫建模通过二维数组实现,0表示通路,1为墙壁,'S'和'E'分别代表起点与终点。遗传算法的核心包括个体编码(路径方向序列)、适应度函数(评估路径有效性)、选择、交叉和变异操作。通过迭代优化,算法逐步生成更优路径,最终找到从起点到终点的最佳解决方案。文末还展示了结果可视化方法及遗传算法的应用前景。
319 5
|
算法 Java
算法系列之回溯算法
回溯算法(Backtracking Algorithm)是一种通过穷举来解决问题的方法,它的核心思想是从一个初始状态出发,暴力搜索所有可能的解决方案,遇到正确解将其记录,直到找到了所有的解或者尝试了所有的可能为止。
779 4
算法系列之回溯算法
|
机器学习/深度学习 算法 数据可视化
基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真
本内容展示了基于Q-learning算法的机器人迷宫路径搜索仿真及其实现过程。通过Matlab2022a进行仿真,结果以图形形式呈现,无水印(附图1-4)。算法理论部分介绍了Q-learning的核心概念,包括智能体、环境、状态、动作和奖励,以及Q表的构建与更新方法。具体实现中,将迷宫抽象为二维网格世界,定义起点和终点,利用Q-learning训练机器人找到最优路径。核心程序代码实现了多轮训练、累计奖励值与Q值的可视化,并展示了机器人从起点到终点的路径规划过程。
665 0
【算法】栈
栈相关算法题,供参考,附有链接地址及板书
227 14

热门文章

最新文章