📜  门| GATE-IT-2004 |第 35 题(1)

📅  最后修改于: 2023-12-03 15:12:44.526000             🧑  作者: Mango

门(GATE-IT-2004)第 35 题

题目描述

给定一个由 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。

输入样例1
4 4 3
0001
0011
0110
1100
1 3 2 1
3 3 4 4
2 2 3 3
输出样例1
6
6
-1
解题思路

本题属于最短路问题,可以使用 BFS 解决。

对于每一个询问点,我们都可以使用 BFS 沿着空地进行搜索,直到搜索到目标点或者搜索完所有的空地为止。需要注意的是,在搜索的过程中,需要使用一个 dist 数组记录每一个点距离源点的距离,并在搜索时更新 dist 数组,该数组的初始值需要设置为最大值。如果在搜索过程中搜索到一个目标点,则直接返回该点的距离,否则搜索结束后返回 -1。

代码实现(Markdown)
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))