一、题目描述
网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。
注意:
- 网络信号可以绕过阻隔物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与第二行的数组是合法的,无需处理数量对不上的异常情况;
- 要求输出信号值的位置,不会是阻隔物
五、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 实现【获得完美走位】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。