问题描述:
给定一个迷宫地图,包含空地、墙壁、起点和终点。迷宫地图由二维数组表示,数组的每个元素代表一个迷宫的单元格。
要求设计一个程序,通过遍历迷宫地图,找出一条从起点到终点的路径。
迷宫地图的规则如下:
- 数组的每个元素值为0表示空地,元素值为1表示墙壁;
- 迷宫地图的起点位置用元素值为2表示;
- 迷宫地图的终点位置用元素值为3表示;
- 路径只能沿着空地移动,不能穿过墙壁;
- 路径只能沿上、下、左、右四个方向移动,不能斜向移动;
输入:
迷宫地图的二维数组,起点和终点的坐标。
输出:
从起点到终点的路径。
算法思路:
可以使用深度优先搜索(DFS)算法来解决迷宫问题。具体步骤如下:
- 创建一个栈,将起点的坐标压入栈中;
- 创建一个二维数组visited,用于记录已经访问过的单元格,初始值全为False;
- 创建一个空路径path,用于保存当前的路径;
- 进入循环,直到栈为空:
- 弹出栈顶元素,将其标记为已访问;
- 如果当前单元格为终点,则返回路径path;
- 否则,将当前单元格的坐标加入路径path;
- 检查当前单元格的四个相邻单元格,如果相邻单元格为可访问的空地且未访问过,则将其坐标压入栈中;
- 如果栈为空,且终点还未找到,则返回空路径。
实现代码如下(使用Python语言):
def dfs(maze, start, end):
stack = [] # 创建栈
stack.append(start) # 将起点压入栈中
visited = [[False] * len(maze[0]) for _ in range(len(maze))] # 创建visited数组,记录已访问过的单元格
path = [] # 创建路径数组
while stack:
curr = stack.pop() # 弹出栈顶元素
x, y = curr
visited[x][y] = True # 标记当前单元格为已访问
if curr == end: # 如果当前单元格为终点
path.append(curr) # 将终点加入路径
return path
path.append(curr) # 将当前单元格加入路径
# 检查上、下、左、右四个相邻单元格
neighbors = [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)]
for neighbor in neighbors:
nx, ny = neighbor
# 如果相邻单元格为可访问的空地且未访问过
if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and maze[nx][ny] == 0 and not visited[nx][ny]:
stack.append((nx, ny)) # 将相邻单元格的坐标压入栈中
return [] # 如果栈为空,且终点还未找到,则返回空路径
# 测试代码
maze = [[0, 1, 1, 1, 1, 1],
[0, 0, 1, 0, 0, 1],
[1, 0, 0, 0, 1, 0],
[0, 1, 1, 0, 1, 1],
[0, 1, 0, 0, 0, 0],
[0, 2, 0, 3, 1, 0]]
start = (5, 1)
end = (3, 3)
path = dfs(maze, start, end)
print("Path: ", path)
运行以上代码,将输出从起点到终点的路径。