递归法解决迷宫问题的 Python 实现

本文介绍了如何使用递归法解决迷宫问题,从问题描述、示例图到算法思路,详细阐述了实现过程,包括标记当前位置、检查相邻可通行点,并提供了完整的Python代码实现。
摘要由CSDN通过智能技术生成

迷宫问题

问题描述:

迷宫可用方阵 [m, n] 表示,0 表示可通过,1 表示不能通过。若要求左上角 (0, 0) 进入,设计算法寻求一条能从右下角 (m-1, n-1) 出去的路径。

示例图:

期望输出路径图
此示例图基本参数为:

  • m:对应 x 轴
  • n:对应 y 轴
  • 绿色线代表期望输出的路径
算法思路
  1. 标记当前所在位置
  2. 如果此时所在位置为终点,说明可以到达终点,退出递归;
    否则,则存在 4 种可能的移动方向即上、下、左、右,遍历这 4 个方向,如果这 4 个方向存在相邻值为 0 的点,则将当前点坐标标记为该相邻值为 0 的点坐标,进入递归

直观理解为:
递归理解图
上图中红色圈的相邻值为 0 的点有 3 个,则会依次遍历这 3 个点寻求某一条件并进入递归

实现过程
  1. 标记函数

    def mark(maze, pos):
        """
        标记函数,用来标记历史走过的位置
        :param maze: 一个 m*n 大小的二维矩阵迷宫
        :param pos: 当前需要标记的位置坐标 pos = (x, y),x = pos[0], y = pos[1]
        """
        maze[pos[0]][pos[1]] = 2  # 将走过的位置标记为 2
    
  2. 移动函数

    def move(maze, pos):
        """
        移动函数,用来测试当前位置是否可继续移动,移动条件为当前位置为 0
        :param maze: 一个 m*n 大小的二维矩阵迷宫
        :param pos: 当前需要标记的位置坐标 pos = (x, y),x = pos[0], y = pos[1]
        :return: bool 类型
        """
        return maze[pos[0]][pos[1]] == 0
    
  3. 核心函数 - 路径查找函数

    def find_path(maze, start, end):
        """
        路径查找函数
        :param maze: 一个 m*n 大小的二维矩阵迷宫
        :param start: 起始点位置坐标,start = (1, 1)
        :param end: 终点坐标,end = (m, n)
        :return: bool 类型
        """
        mark(maze, start)  # 将起始位置标记
        if start == end:  # 路径查找(递归)终止条件为到达终点
            move_path.append(start)
            return True
    
        # 未到达终点时,存在 4 种可能的移动方向,即上 (-1, 0),下 (1, 0),左 (0, -1),右 (0, 1)
        move_direction = [
            (-1, 0), (1, 0), (0, -1), (0, 1)
        ]
        direction = ['↑', '↓', '←', '→']
        for i in range(4):  # 遍历 4 种可能的方向
            next_start = (start[0] + move_direction[i][0], start[1] + move_direction[i][1])  # 下一个可能的起始点坐标
            if move(maze, next_start):  # 找出存在 0 即可移动的下一个起始点坐标,进入递归
                if find_path(maze, next_start, end):
                    # 这里之所以仍然添加起始点坐标是因为当查询到下一个位置就是终点或者可到达终点时记录此时位置
                    move_path.append(start)
                    path_direction.append(direction[i])  # 记录路径方向
                    return True
        return False  # 遍历递归了 4 种可能方向后仍不能到达终点则说明无法走出迷宫
    

    算法到这里基本上已经算完成,整体上不算太复杂

美化输出
  1. 生成带有移动路径数据的迷宫矩阵

    def path_maze(maze, directions_map):
        """
        生成带有移动路径的迷宫矩阵
        :param maze: 一个 m*n 大小的二维矩阵迷宫
        :param directions_map: 一个记录移动方向坐标的字典,有 ↑,↓,←,→ 4 个元素
        :return: path_maze
        """
        n, m = len(maze[0]), len(maze)
        for x in range(1, m-1):
            for y in range(1, n-1):
                maze[x][y] = maze[x][y] if maze[x][y] != 2 else 0  # 将标记的 2 还原为 0
    
        for x in range(m):
            for i in range(1, 2 * n - 1, 2):
                maze[x].insert(i, '   ')  # 重初始化 maze,在每两个元素间插入占位符 '   ' 3 个空格
    
        for x in range(1, 2 * m 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值