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

2023-04-16 00:00:00 递归 迷宫 求解

迷宫问题解决算法的核心在于回溯思想,即不断地尝试出路,若当前点无法到达终点,则回溯到上一个点,选择其他方向继续尝试。

具体实现过程中,可以用递归函数实现。递归函数的参数要有当前位置的坐标和迷宫地图。对于当前位置,可以分别尝试四个方向(上、下、左、右),如果某个方向可以到达终点,则直接返回True,否则继续回溯。

下面是一个简单的Python实现代码:

def solve_maze(x, y, maze):
    if x < 0 or x >= len(maze) or y < 0 or y >= len(maze[0]):
        # 位置越界
        return False
    if maze[x][y] == 'e':
        # 到达终点
        return True
    if maze[x][y] == '#' or maze[x][y] == '.':
        # 墙或已访问过的位置
        return False
    maze[x][y] = '.'  # 标记为已访问
    # 尝试四个方向
    if solve_maze(x+1, y, maze) or solve_maze(x-1, y, maze) or \
            solve_maze(x, y+1, maze) or solve_maze(x, y-1, maze):
        return True
    maze[x][y] = ' '  # 回溯,取消标记
    return False

if __name__ == '__main__':
    maze = [
        ['#', '#', '#', '#', '#', '#', '#', '#', '#', '#'],
        ['#', '.', '.', '.', '.', '#', '.', '.', '.', '#'],
        ['#', '.', '#', '#', '.', '#', '.', '#', '.', '#'],
        ['#', 'e', '.', '#', '.', '.', '.', '#', '.', '#'],
        ['#', '.', '.', '#', '#', '#', '.', '#', '.', '#'],
        ['#', '#', '.', '.', '.', '#', '.', '#', '.', '#'],
        ['#', '.', '#', '#', '.', '#', '#', '#', '.', '#'],
        ['#', '.', '.', '.', '.', '.', '.', '.', '.', '#'],
        ['#', '#', '#', '#', '#', '#', '#', '#', '#', '#']
    ]
    if solve_maze(1, 1, maze):
        for row in maze:
            print(' '.join(row))
    else:
        print('No solution.')

以上代码在迷宫中寻找从起点(1,1)到终点(3,1)的路径。其中,迷宫用二维列表表示,'#'表示墙,'.'表示已访问过的位置,'e'表示终点。运行结果如下:

# # # # # # # # # #
# . . . . # . . . #
# . # # . # . # . #
# . e . # . . . # #
# . . # # # . # . #
# # . . . # . # . #
# . # # . # # # . #
# . . . . . . . . #
# # # # # # # # # #

可以看到,找到了一条通往终点的路径,用'.'标记了访问过的位置。

相关文章