一、题目描述
网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。
注意:
- 网络信号可以绕过阻隔物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
1 4
代表如下地图
需要输出第2行第1列的网络信号值。
三、输出描述
输出对应位置的网络信号值,如果网络信号未覆盖到,也输出0。
一个网格如果可以途经不同的传播衰减路径传达,取较大的值作为其信号值。
四、补充说明
- m不一定等于n,m<100,n<100,网络信号值小于1000;
- 信号源只有1个,阻隔物可能有0个或多个;
- 输入的m,n与第二行的数组是合法的,无需处理数量对不上的异常情况;
- 要求输出信号值的位置,不会是阻隔物
五、解题思路
- 读取输入的m和n,表示数组的行数和列数。
- 创建一个大小为m*n的二维数组arr来存储输入的网格地图。
- 使用变量x和y记录信号源的坐标,初始化为0。
- 使用两重循环遍历输入的m*n个整数,同时找到信号源的坐标。
- 读取结果坐标x1和y1。
- 调用递归函数get(x, y, arr)来计算网络信号值。
- 输出arr[x1][y1]作为结果。
递归函数get(x, y, arr)的思路如下:
- 获取arr的行数m和列数n。
- 如果x或y超出数组的边界,直接返回。
- 如果arr[x][y]小于等于1,说明该位置已经被覆盖,直接返回。
- 创建一个数组arr2,其中每个元素表示相邻位置的偏移量,分别为左、右、上、下。
- 遍历arr2中的每个偏移量:
- 计算相邻位置的坐标a和b。
- 如果a或b超出数组的边界,跳过当前循环。
- 如果arr[a][b]为-1,说明该位置是阻隔物,跳过当前循环。
- 如果arr[x][y]-1大于arr[a][b],说明通过当前位置可以提供更强的信号,更新arr[a][b]的值为arr[x][y]-1。
- 调用递归函数get(a, b, arr)继续向相邻位置传播信号。
- 递归函数结束。
六、Python算法源码
def calculate_signal(m, n, grid, x1, y1):
# 将一维数组转换为二维数组
arr = []
for i in range(m):
row = grid[i * n: (i + 1) * n]
arr.append(row)
x, y = 0, 0
for i in range(m):
for j in range(n):
if arr[i][j] > 0:
x, y = i, j
get(x, y, arr)
return arr[x1 - 1][y1 - 1]
def get(x, y, arr):
m = len(arr)
n = len(arr[0])
if x < 0 or x >= m or y < 0 or y >= n:
return
if arr[x][y] <= 1:
return
arr2 = [[0, -1], [0, 1], [-1, 0], [1, 0]]
for a, b in arr2:
a += x
b += y
if 0 <= a < m and 0 <= b < n:
if arr[a][b] == -1:
continue
if arr[x][y] - 1 > arr[a][b]:
arr[a][b] = arr[x][y] - 1
get(a, b, arr)
七、效果展示
1、输入
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、输出
0
🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。