📅  最后修改于: 2023-12-03 14:58:34.725000             🧑  作者: Mango
问题描述:在给定的矩阵中,门被表示为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)
代码说明:
其它说明:
此题目为广度优先搜索的基础题目,该题目的难点在入门,难度评分为★。建议初学者在做题过程中,加深对广度优先搜索算法的理解和掌握。