日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 地下迷宫·算法·(ACM/蓝桥杯)·递归解法

發布時間:2024/8/26 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 地下迷宫·算法·(ACM/蓝桥杯)·递归解法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:小青蛙有一天不小心落入了一個地下迷宮,小青蛙希望用自己僅剩的體力值P跳出這個地下迷宮。為了讓問題簡單,假設這是一個n*m的格子迷宮,迷宮每個位置為0或者1,0代表這個位置有障礙物,小青蛙達到不了這個位置;1代表小青蛙可以達到的位置。小青蛙初始在(0,0)位置,地下迷宮的出口在(0,m-1)(保證這兩個位置都是1,并且保證一定有起點到終點可達的路徑),小青蛙在迷宮中水平移動一個單位距離需要消耗1點體力值,向上爬一個單位距離需要消耗3個單位的體力值,向下移動不消耗體力值,當小青蛙的體力值等于0的時候還沒有到達出口,小青蛙將無法逃離迷宮。現在需要你幫助小青蛙計算出能否用僅剩的體力值跳出迷宮(即達到(0,m-1)位置)。 輸入描述:輸入包括n+1行:第一行為三個整數n,m(3 <= m,n <= 10),P(1 <= P <= 100)接下來的n行:每行m個0或者1,以空格分隔輸出描述:如果能逃離迷宮,則輸出一行體力消耗最小的路徑,輸出格式見樣例所示;如果不能逃離迷宮,則輸出”Can not escape!”。 測試數據保證答案唯一輸入例子:4 4 10 1 0 0 1 1 1 0 1 0 1 1 1 0 0 1 1輸出例子:[0,0],[1,0],[1,1],[2,1],[2,2],[2,3],[1,3],[0,3]BFS最短路徑,并且記錄路徑。

解題思路:

采用遞歸的方法分別像上下左右四個方向找出口,找到出口以后與上一條比較是否為更省能量的一條路徑,如果是,就更新路徑,如果不是,就繼續遞歸。

編碼前提示:

請先思考明白再寫,否則真的沒啥效果。

import java.util.*;public class Test {static int n = 0, m = 0, maxEnergy = 0;static int[][] map ;static boolean flag = false;static String path = "";static LinkedList<String> l = new LinkedList<>();public static void main(String[] args) {int p ;Scanner s = new Scanner(System.in);if (s.hasNext()) {n = s.nextInt();m = s.nextInt();p = s.nextInt();map = new int[n][m];for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {map[i][j] = s.nextInt();}}runMap(0, 0, p);if (flag) {System.out.println(path);} else {System.out.println("Can not escape");}}}/*** 更新路徑*/public static void updataPath(){StringBuffer sb = new StringBuffer();Iterator<String> i = l.iterator();while(i.hasNext()){sb.append(i.next()+',');}if (sb.length() > 0){sb.deleteCharAt(sb.length()-1);}path = sb.toString();}/*** 走迷宮* @param x 行* @param y 列* @param energy 能量*/public static void runMap(int x, int y, int energy){//如果邊界越界或者能量消耗完或者此路不通的時候if (x<0 || y<0 || x>=m || y>=n || energy<0 || map[x][y] != 1){return;}//此路可以走else{map[x][y] = 2;l.offer("["+x+","+y+"]");if (x==0 && y==m-1)//到達出口{/*** 到出口要干的事:* 判斷是不是最省能量的路徑-->如果不是,更新路徑;如果是,退出遞歸,打印路徑*/if (energy >= maxEnergy)//消耗的能量越少,剩下的能量就越多,如果這次剩下了更多的能量,就說明這一條路消耗更少的能量,就更新路徑{maxEnergy = energy;updataPath();}//跟新完路徑之后,將此處之前該過的值改回去,在沿著之前的路徑朝回走map[x][y] = 1;l.removeLast();flag = true;return ;}}//往上走runMap(x-1, y, energy-3);//往右走runMap(x, y+1, energy-1);//往下走runMap(x+1, y, energy);//往左走runMap(x, y-1, energy-1);//如果往上下左右四個方向都走不通,就沿原路返回,到上一個節點處在看能不能往其他方向走map[x][y] = 1;l.removeLast();} }

祝你在大學的時候能獲得一個國家級的算法比賽的國二級別以上的成績,這將是你一生的財富。

總結

以上是生活随笔為你收集整理的Java 地下迷宫·算法·(ACM/蓝桥杯)·递归解法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。