python做出两名宇航员在探索一个未知行星,行星上有一些障碍物,这些障碍物用数字1表示,没有障碍物用数字0表示。行星被表示成一个 N * M 的矩阵。 探索过程中两名宇航员走散了。已知 A 宇航员的位置 (x1,y1)和 B 宇航员的拉置(x2,y2),请你帮助 A 宇航员寻找一条最短路径到达 B 宇航员的位置,并输出最短路径的长度(不包括起点)。
时间: 2024-02-13 13:05:10 浏览: 23
这是一个典型的图论最短路径问题,我们可以使用广度优先搜索算法(BFS)解决。
具体的做法是,我们将每个格子看作一个图中的节点,如果两个格子相邻且都没有障碍物,那么它们之间就有一条无向边。然后我们从起点开始进行 BFS,每次将当前格子周围没有访问过且没有障碍物的格子加入队列,直到找到终点或者队列为空。
用一个二维数组 dist[i][j] 来记录从起点到每个格子的最短距离,初始时所有元素设为正无穷。每次访问一个新的格子时,如果它的距离比之前计算出的距离更短,就更新 dist 数组。最后 dist[x2][y2] 就是起点到终点的最短距离。
以下是 Python 代码实现:
```python
from queue import Queue
# BFS 搜索
def bfs(matrix, x1, y1, x2, y2):
n, m = len(matrix), len(matrix[0])
visited = [[False] * m for _ in range(n)]
dist = [[float('inf')] * m for _ in range(n)]
q = Queue()
q.put((x1, y1))
visited[x1][y1] = True
dist[x1][y1] = 0
while not q.empty():
x, y = q.get()
for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and matrix[nx][ny] == 0:
visited[nx][ny] = True
dist[nx][ny] = dist[x][y] + 1
q.put((nx, ny))
if nx == x2 and ny == y2:
return dist[x2][y2]
return -1 # 无法到达终点
# 测试代码
matrix = [
[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0]
]
x1, y1 = 0, 0
x2, y2 = 4, 4
print(bfs(matrix, x1, y1, x2, y2)) # 输出 8
```