📜  门| Sudo GATE 2021的测验|问题9(1)

📅  最后修改于: 2023-12-03 14:58:34.725000             🧑  作者: Mango

Sudo GATE 2021的测验-问题9

问题描述:在给定的矩阵中,门被表示为0,其他位置被表示为1。您需要找到最近的门,并打印出该门到每个位置的最短距离。

输入格式:第一行包含整数T,表示测试用例的数量。每个测试用例包含两个整数行R和C,表示矩阵的大小。接下来的R行包含C个整数,表示矩阵。

输出格式:对于每个测试用例,输出R行,每行包含C个空格分隔的整数,表示每个位置到最近的门的距离。

示例:

输入: 2 3 3 1 0 1 1 1 0 1 1 1 2 2 1 0 1 1

输出: 0 1 0 1 2 0 2 2 1 0 1 1 0

思路:使用广度优先搜索算法来解决这个问题。我们可以将门作为起点,使用递归算法遍历所有相邻的位置,找到最近的门。

代码片段:

def solve(r, c, a):
    # 定义方向,向上、向下、向左、向右
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    # 初始化结果数组,将初始值都赋为-1
    ans = [[-1] * c for _ in range(r)]

    # 定义宽度优先搜索
    def bfs():
        queue = []
        for i in range(r):
            for j in range(c):
                if a[i][j] == 0:
                    queue.append((i, j))
                    ans[i][j] = 0

        while queue:
            i, j = queue.pop(0)
            for k in range(4):
                ni, nj = i + dx[k], j + dy[k]
                if 0 <= ni < r and 0 <= nj < c and ans[ni][nj] == -1:
                    queue.append((ni, nj))
                    ans[ni][nj] = ans[i][j] + 1

    bfs()

    # 输出结果
    for i in range(r):
        print(' '.join(str(x) for x in ans[i]))

# 测试用例输入
T = int(input())
for _ in range(T):
    r, c = map(int, input().split())
    a = [list(map(int, input().split())) for _ in range(r)]
    solve(r, c, a)

代码说明:

  1. 定义方向变量dx和dy来代表向上、向下、向左和向右4个方向。
  2. 初始化结果数组ans。由于我们需要找到距离每个位置最近的门,因此我们可以将初始值都赋为-1。
  3. 定义宽度优先搜索函数bfs。搜索的起点为门的位置,将起点加入队列,并将其初始值设为0。接着,按顺序遍历队列,并将其相邻的点一一添加到队列中。如果相邻的点未被访问过,则将其访问值设为1,并将其加入队列中,分布计算所有点到门的距离。
  4. 输出结果。遍历结果数组ans并输出其值,需要使用join函数将每行结果拼接为字符串。

其它说明:

此题目为广度优先搜索的基础题目,该题目的难点在入门,难度评分为★。建议初学者在做题过程中,加深对广度优先搜索算法的理解和掌握。