给定一个M×N的迷宫图、入口与出口、行走规则。求一条从 指定入口到出口的路径。所求路径必须是简单路径,即路径不重复。 行走规则:上、下、左、右相邻方块行走。其中(i,j)表示一个方块
时间: 2023-05-26 07:06:02 浏览: 199
的位置, maze[i][j]表示该方块的属性:
0:可以行走
1:障碍物,不能行走
路径可以使用广度优先搜索或深度优先搜索算法求解。下面以广度优先搜索算法为例讲解。
算法步骤:
1.将起点入队并标记为已访问。
2.从队首取出一个节点,按照上、下、左、右的顺序遍历其相邻节点,若该节点未被访问且不是障碍物,则将其入队,标记为已访问,同时记录其父节点。
3.重复步骤2,直到队列为空或者到达终点。
4.若到达终点,则从终点开始沿着父节点指针逆推路径,得到所求路径。
Python示例代码:
from collections import deque
maze = [[0, 1, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]]
start = (0, 0) # 入口坐标
end = (4, 4) # 出口坐标
def bfs(maze, start, end):
# 记录访问状态和父节点
visited = [[False] * len(maze[0]) for _ in range(len(maze))]
parent = [[[None, None] for _ in range(len(maze[0]))] for _ in range(len(maze))]
queue = deque([start])
visited[start[0]][start[1]] = True
while queue:
x, y = queue.popleft()
if (x, y) == end:
break
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = x + dx, y + dy
if 0 <= nx < len(maze) and 0 <= ny < len(maze[0]) and not visited[nx][ny] and not maze[nx][ny]:
queue.append((nx, ny))
visited[nx][ny] = True
parent[nx][ny] = [x, y]
if not visited[end[0]][end[1]]:
return None
path = []
x, y = end
while (x, y) != start:
path.append((x, y))
x, y = parent[x][y]
path.append((x, y))
path.reverse()
return path
print(bfs(maze, start, end))
# 输出:[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (2, 3), (3, 3), (4, 3), (4, 4)]
阅读全文