华为OD机试真题 Java 实现【计算网络信号】【2023Q2 200分】-LMLPHP

一、题目描述

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

注意:

  1. 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图,array[i][j]=0代表i行j列是空旷位置;
  2. array[i][j]=x(x为正整数)代表i行j列是信号源,信号强度是x;
  3. array[i][j]=-1代表i行j列是阻隔物。

信号源只有1个,阻隔物可能有0个或多个网络信号衰减是上下左右相邻的网格衰减1现要求输出对应位置的网络信号值。

二、输入描述

输入为三行,

  1. 第一行为m n,代表输入是一个m*n的数组;
  2. 第二行是一串m*n个用空格分隔的整数。每连续n个数代表一行,再往后n个代表下一行,以此类推。对应的值代表对应的网格是空旷位置,还是信号源,还是阻隔物;
  3. 第三行是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。

一个网格如果可以途经不同的传播衰减路径传达,取较大的值作为其信号值。

四、补充说明

  1. m不一定等于n,m<100,n<100,网络信号值小于1000;
  2. 信号源只有1个,阻隔物可能有0个或多个;
  3. 输入的m,n与第二行的数组是合法的,无需处理数量对不上的异常情况;
  4. 要求输出信号值的位置,不会是阻隔物

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int m = sc.nextInt();
    int n = sc.nextInt();
    int[][] arr = new int[m][n];

    //信号源横坐标
    int x = 0;
    //信号源纵坐标
    int y = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            arr[i][j] = sc.nextInt();
            if (arr[i][j] > 0) {
                x = i;
                y = j;
            }
        }
    }
    //结果坐标
    int x1 = sc.nextInt();
    int y1 = sc.nextInt();
    get(x, y, arr);
    System.out.println(arr[x1][y1]);
}

public static void get(int x, int y, int[][] arr) {
    int m = arr.length;
    int n = arr[0].length;
    if (x < 0 || x > m || y < 0 || y > n) {
        return;
    }
    if (0 <= x && x < m && 0 <= y && y < n && arr[x][y] <= 1) {
        return;
    }
    int[][] arr2 = new int[][]{{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
    for (int i = 0; i < arr2.length; i++) {
        int a = x + arr2[i][0];
        int b = y + arr2[i][1];
        if (0 <= a && a < m && 0 <= b && 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机试真题 Java 实现【计算网络信号】【2023Q2 200分】-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【计算网络信号】【2023Q2 200分】-LMLPHP

05-22 02:10