NowCoder最喜歡遊樂場的迷宮遊戲,他和小夥伴們比賽誰先走出迷宮。
如今把迷宮的地圖給你,你能幫他算出最快走出迷宮須要多少步嗎?java
輸入包含多組數據。
每組數據包含一個10*10,由「#」和「.」組成的迷宮。其中「#」表明牆;「.」表明通路。
入口在第一行第二列;出口在最後一行第九列。
從任意一個「.」點都能一步走到上下左右四個方向的「.」點。算法
對應每組數據,輸出從入口到出口最短鬚要幾步。spa
#.######## #........# #........# #........# #........# #........# #........# #........# #........# ########.# #.######## #........# ########.# #........# #.######## #........# ########.# #........# #.######.# ########.#
16 30
由於題意是使用最少的步數走出迷宮,所要可使用廣度優先遍歷的方式,每處理完一層說明走了一步,最早到達出口使用的步數最少。根據輸入的例子,迷宮的走法如圖1所示。
圖1 迷宮找最短路徑code
import java.util.ArrayDeque; import java.util.Queue; import java.util.Scanner; /** * Declaration: All Rights Reserved !!! */ public class Main { private final static int N = 10; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt")); while (scanner.hasNextLine()) { char[][] maze = new char[N][N]; for (int i = 0; i < N; i++) { maze[i] = scanner.nextLine().toCharArray(); } System.out.println(minStep(maze)); } scanner.close(); } /** * 求使用最少的步驟走出迷宮,迷宮大小固定爲10*10,起點爲(0, 1),終點爲(9, 8) * * @param maze 迷宮 * @return 走出迷宮最少的步數,走不出去返回-1 */ private static int minStep(char[][] maze) { // 記錄當前處理層的位置 Queue<Integer> curr = new ArrayDeque<>(N * N); // 記錄下一層處理的位置 Queue<Integer> next = new ArrayDeque<>(N * N); // 能夠移動的四個方向,兩個一組 int[] d = {1, 0, 0, 1, -1, 0, 0, -1}; // 添加起點; curr.add(0); curr.add(1); int x; int y; // 記錄最少的步數 int step = 0; while (!curr.isEmpty()) { x = curr.remove(); y = curr.remove(); // 找到終點位置 if (x == 9 && y == 8) { return step; } // 處理(x, y)位置的四個方向 for (int i = 0; i < d.length; i += 2) { int t = x + d[i]; int v = y + d[i + 1]; if (t >= 0 && t < N && v >= 0 && v < N && maze[t][v] == '.') { // 標記已經訪問過 maze[t][v] = '#'; // 訪問的位置添加到隊列中 next.add(t); next.add(v); } } // 當前層已經處理完 if (curr.isEmpty()) { // 步數加一 step++; // 處理下一層 Queue<Integer> temp = curr; curr = next; next = temp; } } // 執行到此說明找不到出路 return -1; } }