2025A卷-计算网络信号

题目描述

网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。

注意:

网络信号可以绕过阻隔物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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值