题目描述
网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意: 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图,array[i][j]=0代表i行j列是空旷位置; array[i][j]=x(x为正整数)代表i行j列是信号源,信号强度是x; array[i][j]=-1代表i行j列是阻隔物。 信号源只有1个,阻隔物可能有0个或多个,网络信号衰减是上下左右相邻的网格衰减1,现要求输出对应位置的网络信号值。
输入描述
输入为三行, 第一行为m n,代表输入是一个m*n的数组; 第二行是一串m*n个用空格分隔的整数。每连续n个数代表一行,再往后n个代表下一行,以此类推。对应的值代表对应的网格是空旷位置,还是信号源,还是阻隔物; 第三行是i j,代表需要计算array[i][j]的网络信号值,注意:此处i和j均从0开始,即第一行i为0;
例如
6 5
0 0 0 -1 0
0 0 0 0 0
0 0 -1 4 0
0 0 0 0 0
0 0 0 0 -1
0 0 0 0 0
2 1
需要输出第2行第1列的网络信号值。
输出描述
输出对应位置的网络信号值,如果网络信号未覆盖到,也输出0。 一个网格如果可以途经不同的传播衰减路径传达,取较大的值作为其信号值。 补充说明 1、m不一定等于n,m<100,n<100,网络信号值小于1000; 2、信号源只有1个,阻隔物可能有0个或多个; 3、输入的m,n与第二行的数组是合法的,无需处理数量对不上的异常情况; 4、要求输出信号值的位置,不会是阻隔物
用例
【用例一】
输入
6 5
0 0 0 -1 0
0 0 0 0 0
0 0 -1 4 0
0 0 0 0 0
0 0 0 -1 0
0 0 0 0 0
2 1
输出
0
说明
信号源在 (2,3) 强度为 4。由于阻隔物的影响以及信号衰减,信号无法传播到 (2,1) 处,因此输出 0。
【用例二】
输入
4 4
0 0 0 0
0 -1 0 0
0 0 7 0
0 0 0 0
0 0
输出
3
说明
信号源在 (2,2) 强度为 7。虽然 (1,1) 为阻隔物,但信号可沿其它路径传播到 (0,0) ,经过多步传播最终 (0,0) 的信号为 3。
Python代码实现
import sys
"""
思路:
1、不同的遍历路径,走到了指定的那个点,更新那个点出的信号值,每次都进行比较,更新为最大的值
2、不同的路径,走到那个点,必然会重复访问那个点; 故不用visited数组,去标记这个点是否访问过了
3、经过这个点时,经过比较,需要更新这个点的值时,它的周边的点才会继续更新,才应该把它添加到队列中去。
如果这个点已经是最大值了,不需要更新,则也不需要把他添加到队列中去了
"""
from typing import List
sys.setrecursionlimit(10000)
dr = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# 广度搜索
def bfs(m, n, nums, x, y):
stack = [(x, y)]
while len(stack) > 0:
x, y = stack.pop()
for dx, dy in dr:
new_x = x + dx
new_y = y + dy
if new_x < 0 or new_x >= m or new_y < 0 or new_y >= n:
continue
if nums[new_x][new_y] == -1:
continue
if nums[new_x][new_y] < nums[x][y] - 1:
nums[new_x][new_y] = nums[x][y] - 1
# 经过比较,nums[new_x][new_y]需要更新时,才需要将(new_x,new_y)添加到队列中去。
stack.append((new_x, new_y))
print(stack)
# 深度优先搜索
def dfs(m, n, nums, x, y):
if nums[x][y] <= 1:
return
for dx, dy in dr:
new_x = x + dx
new_y = y + dy
if new_x < 0 or new_x >= m or new_y < 0 or new_y >= n:
continue
if nums[new_x][new_y] == -1:
continue
if nums[new_x][new_y] < nums[x][y] - 1:
nums[new_x][new_y] = nums[x][y] - 1
# 递归处理下一个要处理的点
dfs(m, n, nums, new_x, new_y)
def main(m, n, nums: List, x, y):
# 找到信号源地址
source_x = 0
source_y = 0
for i in range(m):
for j in range(n):
if nums[i][j] != 0 and nums[i][j] != -1:
source_x = i
source_y = j
break
print(f"source_x,source_y: {source_x} {source_y}")
# bfs(m, n, nums, source_x, source_y)
dfs(m,n,nums, source_x,source_y)
print(nums)
print(nums[x][y])
if __name__ == '__main__':
m, n = 4, 4
nums = [[0, 0, 0, 0], [0, -1, 0, 0], [0, 0, 7, 0], [0, 0, 0, 0]]
x, y = 0, 0
main(m, n, nums, x, y)