網(wǎng)站建設(shè)相關(guān)推薦網(wǎng)絡(luò)優(yōu)化工程師前景
題目描述:
網(wǎng)絡(luò)信號經(jīng)過傳遞會逐層衰減,且遇到阻隔物無法直接穿透,在此情況下需要計算某個位置的網(wǎng)絡(luò)信號值。注意:網(wǎng)絡(luò)信號可以繞過阻隔物
array[m][n]的二維數(shù)組代表網(wǎng)格地圖,
array[i][j]=0代表i行j列是空曠位置;array[i][j]=x(x為正整數(shù))代表i行j列是信號源,信號強度是x;array[i][j]=-1代表i行j列是阻隔物。
信號源只有1個,阻隔物可能有0個或多個
網(wǎng)絡(luò)信號衰減是上下左右相鄰的網(wǎng)格衰減1
現(xiàn)要求輸出對應(yīng)位置的網(wǎng)絡(luò)信號值
輸入描述:
輸入為三行,
第一行為m n,代表輸入是一個m*n的數(shù)組
第二行是一串m*n個用空格分隔的整數(shù)。每連續(xù)n個數(shù)代表一行,再往后n個代表下一行,以此類推。對應(yīng)的值代表對應(yīng)的網(wǎng)格是空曠位置,還是信號源,還是阻隔物
第三行是i j,代表需要計算array[i][j]的網(wǎng)絡(luò)信號值,注意:此處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列的網(wǎng)絡(luò)信號值,如下圖,值為2
輸出描述:
輸出對應(yīng)位置的網(wǎng)絡(luò)信號值,如果網(wǎng)絡(luò)信號未覆蓋到,也輸出0。
一個網(wǎng)格如果可以途經(jīng)不同的傳播衰減路徑傳達,取較大的值作為其信號值。
補充說明:
1、m不一定等于n,m<100,n<100,網(wǎng)絡(luò)信號值小于1000
2、信號源只有1個,阻隔物可能有0個或多個
3、輸入的m,n與第二行的數(shù)組是合法的,無需處理數(shù)量對不上的異常情況
4、要求輸出信號值的位置,不會是阻隔物
示例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
說明:
示例2
輸入:
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
說明:題目描述:
網(wǎng)絡(luò)信號經(jīng)過傳遞會逐層衰減,且遇到阻隔物無法直接穿透,在此情況下需要計算某個位置的網(wǎng)絡(luò)信號值。注意:網(wǎng)絡(luò)信號可以繞過阻隔物
array[m][n]的二維數(shù)組代表網(wǎng)格地圖,
array[i][j]=0代表i行j列是空曠位置;array[i][j]=x(x為正整數(shù))代表i行j列是信號源,信號強度是x;array[i][j]=-1代表i行j列是阻隔物。
信號源只有1個,阻隔物可能有0個或多個
網(wǎng)絡(luò)信號衰減是上下左右相鄰的網(wǎng)格衰減1
現(xiàn)要求輸出對應(yīng)位置的網(wǎng)絡(luò)信號值
輸入描述:
輸入為三行,
第一行為m n,代表輸入是一個m*n的數(shù)組
第二行是一串m*n個用空格分隔的整數(shù)。每連續(xù)n個數(shù)代表一行,再往后n個代表下一行,以此類推。對應(yīng)的值代表對應(yīng)的網(wǎng)格是空曠位置,還是信號源,還是阻隔物
第三行是i j,代表需要計算array[i][j]的網(wǎng)絡(luò)信號值,注意:此處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列的網(wǎng)絡(luò)信號值,如下圖,值為2
輸出描述:
輸出對應(yīng)位置的網(wǎng)絡(luò)信號值,如果網(wǎng)絡(luò)信號未覆蓋到,也輸出0。
一個網(wǎng)格如果可以途經(jīng)不同的傳播衰減路徑傳達,取較大的值作為其信號值。
補充說明:
1、m不一定等于n,m<100,n<100,網(wǎng)絡(luò)信號值小于1000
2、信號源只有1個,阻隔物可能有0個或多個
3、輸入的m,n與第二行的數(shù)組是合法的,無需處理數(shù)量對不上的異常情況
4、要求輸出信號值的位置,不會是阻隔物
示例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
說明:
示例2
輸入:
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
說明:
題解
BFS 廣度優(yōu)先算法,尋找最短路徑
信號值 - 步數(shù)
源碼
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;public class Main {// 方向數(shù)組,用于表示上下左右四個方向static int[][] directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 讀取輸入的網(wǎng)格大小 m 和 nint m = scanner.nextInt();int n = scanner.nextInt();// 初始化網(wǎng)格int[][] array = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {array[i][j] = scanner.nextInt();}}// 讀取目標位置int targetI = scanner.nextInt();int targetJ = scanner.nextInt();// 初始化信號強度數(shù)組,-1表示未訪問int[][] signal = new int[m][n];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {signal[i][j] = -1;}}// BFS隊列,隊列中存儲 (x, y, signal_strength)Queue<int[]> queue = new LinkedList<>();// 尋找信號源,將信號源的位置加入隊列for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (array[i][j] > 0) { // 找到信號源queue.offer(new int[]{i, j, array[i][j]});signal[i][j] = array[i][j]; // 初始信號值為信號源的值}}}// 開始BFSwhile (!queue.isEmpty()) {int[] current = queue.poll();int x = current[0];int y = current[1];int currentSignal = current[2];// 遍歷四個方向for (int[] dir : directions) {int newX = x + dir[0];int newY = y + dir[1];// 判斷是否越界或遇到阻隔物if (newX >= 0 && newX < m && newY >= 0 && newY < n && array[newX][newY] != -1) {int newSignal = currentSignal - 1;// 只有信號強度大于0并且比當前信號值大時才更新if (newSignal > 0 && newSignal > signal[newX][newY]) {signal[newX][newY] = newSignal;queue.offer(new int[]{newX, newY, newSignal});}}}}// 輸出指定位置的信號值,如果未覆蓋到,輸出0System.out.println(signal[targetI][targetJ] != -1 ? signal[targetI][targetJ] : 0);}
}