单点漫延问题(水陆判断、洪水漫延、无权最小路径)
生活随笔
收集整理的這篇文章主要介紹了
单点漫延问题(水陆判断、洪水漫延、无权最小路径)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述:
給定一個地圖map,1代表不能通行(有阻礙物),0代表可以通行。
給定初始點位置start[m,n];
給定目的地位置dest[x,y];
求start->dest的最短路徑。
輸入示例:
5? ? 5 //map的大小
0? ? 0? ? 1? ? 0? ? 0
0? ? 0? ? 0? ? 0? ? 0
0? ? 0? ? 0? ? 1? ? 0
1? ? 1? ? 0? ? 1? ? 1
0? ? 0? ? 0? ? 0? ? 0
2? ?//start的尺寸
0? ? 4? ?//m,n
2? ?//start的尺寸
4? ? 4? ? //x,y
輸出? ?8
解題思路:
1)初始化一個dp矩陣。所有值設為+∞
2)每一個點都做這樣一件事情:根據(jù)給定的值去設置當前點的值;并判斷周圍的點是否需要更新(大于當前值,則從當前點走會更近);需要則更新;
3)更新起始點位置為0;
4)返回目標點位置的值;
代碼實現(xiàn):
static int ShortestDistance(int[][] map, int[] start, int[] dest) {int[][] dp = new int[map.length][map[0].length];for (int i = 0; i < dp.length; i++) {for (int j = 0; j < dp[i].length; j++) dp[i][j] = Integer.MAX_VALUE;}solve(map,dp,start[0],start[1],0); // for (int i = 0; i < dp.length; i++) { // for (int j = 0; j < dp[i].length; j++) // System.out.print(dp[i][j]+" "); // System.out.println(); // }return dp[dest[0]][dest[1]]; }/*** 根據(jù)給定的值去設置當前點的值;并判斷周圍的點是否需要更新(大于當前值,則從當前點走會更近);需要則更新;* @param map 地圖矩陣* @param dp 路徑長度矩陣* @param i 當前點橫坐標* @param j 當前點縱坐標* @param k 當前點設定值*/private static void solve(int[][] map, int[][] dp, int i, int j, int k) {dp[i][j] = k;if(i+1 < map.length && map[i+1][j] != 1 && dp[i+1][j] > dp[i][j])solve(map,dp,i+1,j,dp[i][j]+1);if(j+1 < map[0].length && map[i][j+1] != 1 && dp[i][j+1] > dp[i][j])solve(map,dp,i,j+1,dp[i][j]+1);if(i-1 >= 0 && map[i-1][j] != 1 && dp[i-1][j] > dp[i][j])solve(map,dp,i-1,j,dp[i][j]+1);if(j-1 >=0 && map[i][j-1] != 1 && dp[i][j-1] > dp[i][j])solve(map,dp,i,j-1,dp[i][j]+1);}?
?
題目描述:
解題思路:
?先判斷是不是海域;在假設在每個點作為機場起點能建的最長長度
海域是用周邊的海域點作為起始點進行水域的漫延:
? ? ? ? ? 如果當前點是水域,同時鄰接點的高度也低于海平面則蔓延至鄰接點;
機場長度是嘗試以每個點作為起始點能建設的最長長度:
? ? ? ? ?當前點高度設為k,如果鄰接點中存在高度更矮的點,則該臨界點的高度為當前點的機場長度+1;
代碼實現(xiàn):
public class Main47 {public static void main(String[] args) { // Scanner in = new Scanner(System.in);int m = 3,n = 5;long depth = 0;long[][] arr = {{14,2,9,10,11},{7,0,9,0,12},{7,7,10,0,13}};System.out.println(solution(arr, m, n, depth));}/*** * @param arr* @param m 行* @param n 列* @param depth* @return*/private static int solution(long[][] arr, int m, int n,long depth) {//1、判斷水域int[][] ocean = new int[m][n];for(int i=0;i<m;i++) {//第一列、最后一列if(arr[i][0] <= depth) dfs(arr,ocean,m,n,i,0,depth);if(arr[i][n-1] <= depth) dfs(arr,ocean,m,n,i,n-1,depth);}for(int i=0;i<n;i++) {//第一行、最后一行if(arr[0][i] <= depth) dfs(arr,ocean,m,n,0,i,depth);if(arr[m-1][i] <= depth) dfs(arr,ocean,m,n,m-1,i,depth);}//2、計算每個點作為起點可建的機場長度int[][] dis = new int[m][n];for (int i = 0; i < dis.length; i++) for (int j = 0; j < dis[i].length; j++) disSoluation(dis,arr,ocean,m,n,i,j,1);//3、尋找最大值int max = 0;for (int i = 0; i < dis.length; i++) {for (int j = 0; j < dis[i].length; j++) {if(dis[i][j]>max)max = dis[i][j];}}return max;}/*** 以i,j點作為起點建機場,更新矩陣* 如果(i,j)點是海洋,中間設該點為0,然后返回* 如果(i,j)點不是海洋,當前更新的高度高于之前的高度,則更新當前點并更新臨近點;否則不進行更新;* @param dis 以當前點作為起點能建設的最大距離* @param arr 地形矩陣* @param ocean 是否是海洋;1:是;0:否* @param m* @param n* @param i* @param j* @param k 更新值*/private static void disSoluation(int[][] dis, long[][] arr, int[][] ocean, int m, int n, int i, int j, int k) {if(ocean[i][j] == 1){dis[i][j] = 0;return;}if(k>dis[i][j]) {dis[i][j] = k;if(i-1 >= 0 && arr[i-1][j] < arr[i][j]) disSoluation(dis,arr,ocean,m,n,i-1,j,k+1);if(i+1 < m && arr[i+1][j] < arr[i][j]) disSoluation(dis,arr,ocean,m,n,i+1,j,k+1);if(j-1 >= 0 && arr[i][j-1] < arr[i][j]) disSoluation(dis,arr,ocean,m,n,i,j-1,k+1);if(j+1 < n && arr[i][j+1] < arr[i][j]) disSoluation(dis,arr,ocean,m,n,i,j+1,k+1);}}/*** 判斷(i,j)點是不是水域,如果是,向四周漫延* @param arr* @param ocean* @param m* @param n* @param i* @param j* @param depth*/private static void dfs(long[][] arr, int[][] ocean, int m, int n, int i, int j,long depth) {if(ocean[i][j] == 1)//已經(jīng)判定為海域return;if(arr[i][j] <= depth) {ocean[i][j] = 1;if(i-1 >= 0) dfs(arr, ocean, m, n, i-1, j, depth);if(i+1 < m) dfs(arr, ocean, m, n, i+1, j, depth);if(j-1 >= 0) dfs(arr, ocean, m, n, i, j-1, depth);if(j+1 < n) dfs(arr, ocean, m, n, i, j+1, depth);}}}?
總結
以上是生活随笔為你收集整理的单点漫延问题(水陆判断、洪水漫延、无权最小路径)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: chosen插件使用
- 下一篇: 日常工作计划安排工具