📅  最后修改于: 2023-12-03 15:12:44.526000             🧑  作者: Mango
给定一个由 0 和 1 构成的矩阵,其中 1 表示墙壁,0 表示空地。现在给定两个点 (x1, y1) 和 (x2, y2),你需要找到一条从 (x1, y1) 到 (x2, y2) 的最短路径。你只能沿着空地走,不能穿过墙。
第一行包括三个整数,n, m, q,分别表示矩阵的行数、列数,以及询问的个数。
接下来 n 行,每行 m 个字符,用来描述矩阵里的空地和墙壁。
接下来 q 行,每行 4 个整数,分别表示询问点的坐标 (x1, y1) 和 (x2, y2)。
输出共 q 行,每行一个整数,表示对应询问的答案。如果找不到合法路径,则输出 -1。
4 4 3
0001
0011
0110
1100
1 3 2 1
3 3 4 4
2 2 3 3
6
6
-1
本题属于最短路问题,可以使用 BFS 解决。
对于每一个询问点,我们都可以使用 BFS 沿着空地进行搜索,直到搜索到目标点或者搜索完所有的空地为止。需要注意的是,在搜索的过程中,需要使用一个 dist 数组记录每一个点距离源点的距离,并在搜索时更新 dist 数组,该数组的初始值需要设置为最大值。如果在搜索过程中搜索到一个目标点,则直接返回该点的距离,否则搜索结束后返回 -1。
from collections import deque
n, m, q = map(int, input().split())
grid = [input() for _ in range(n)]
# BFS
def bfs(x1, y1, x2, y2):
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
dist = [[float('inf')] * m for _ in range(n)]
dist[x1][y1] = 0
q = deque([(x1, y1)])
while q:
x, y = q.popleft()
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] == '0' and dist[nx][ny] > dist[x][y] + 1:
dist[nx][ny] = dist[x][y] + 1
q.append((nx, ny))
return dist[x2][y2] if dist[x2][y2] != float('inf') else -1
# 处理每一个询问
for _ in range(q):
x1, y1, x2, y2 = map(int, input().split())
print(bfs(x1-1, y1-1, x2-1, y2-1))