Python递归实现迷宫问题的求解算法
迷宫问题解决算法的核心在于回溯思想,即不断地尝试出路,若当前点无法到达终点,则回溯到上一个点,选择其他方向继续尝试。
具体实现过程中,可以用递归函数实现。递归函数的参数要有当前位置的坐标和迷宫地图。对于当前位置,可以分别尝试四个方向(上、下、左、右),如果某个方向可以到达终点,则直接返回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 . # . . . # # # . . # # # . # . # # # . . . # . # . # # . # # . # # # . # # . . . . . . . . # # # # # # # # # # #
可以看到,找到了一条通往终点的路径,用'.'标记了访问过的位置。
相关文章