题目描述
网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值,。
注意:
- 网络信号可以绕过阻隔物aray[m][n]的二维数组代表网格地图,array[i][j]=0代表i行j列是空旷位置;
- array[i][j] = x (x为正整数)代表i行j列是信号源,信号强度是x;
- array[i][j] = -1 代表i行列是阻隔物。
信号源只有1个,阻隔物可能有0个或多个网络信号衰减是上下左右相邻的网格衰减1,现要求输出对应位置的网络信号值。
输入描述
输入为三行,
- 第一行为m n,代表输入是一个m*n的数组;
- 第二行是一串m*n个用空格分隔的整数。每连续n个数代表一行,再往后n个代表下一行,以此类推。对应的值代表对应的网格是空旷位置,还是信号源,还是阻隔物;
- 第三行是i j,代表需要计算array[i][j]的网络信号值,注意:此处i和j均从0开始,即第一行i为0;
输出描述
输出对应位置的信号值
例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输出:
0
/*
计算前
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
计算后
0 0 1 -1 1
0 1 2 3 2
0 0 -1 4 3
0 1 2 3 2
0 0 1 2 -1
0 0 0 1 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
*/
public class 信号强度 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
// 信息源坐标
int xinhaoX = 0;
int xinhaoY = 0;
int[][] ints = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int val = sc.nextInt();
if (val > 0){
xinhaoX = i;
xinhaoY = j;
}
ints[i][j] = val;
}
}
int targetX = sc.nextInt();
int targetY = sc.nextInt();
// 计算信息源周围的信号值,并放在对应的数组位置
getk(xinhaoX,xinhaoY,m,n,ints);
System.out.println(ints[targetX][targetY]);
}
private static void getk(int xinhaoX, int xinhaoY, int m, int n, int[][] ints) {
// 判断信息源坐标是否在矩阵中
if (xinhaoX <0 || xinhaoX >= m || xinhaoY < 0 || xinhaoY >= n){
return;
}
// 如何信息源信号为1 直接结束
if (ints[xinhaoX][xinhaoY] == 1){
return;
}
// 遍历递归计算信息源周边的信息值
int[][] arr = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
for (int i = 0; i < arr.length; i++) {
int a = xinhaoX + arr[i][0];
int b = xinhaoY + arr[i][1];
// 判断计算出的信息源周边信息坐标是否在矩阵中
if (a >= 0 && a < m && b >= 0 && b < n){
// 计算出的信息源周边信息坐标 对应的是阻挡物 直接跳过
if (ints[a][b] == -1){
continue;
}
// 计算信息源对应周边的信息值
if (ints[a][b] < ints[xinhaoX][xinhaoY] -1){
ints[a][b] = ints[xinhaoX][xinhaoY]-1;
getk(a,b,m,n,ints);
}
}
}
}
}