它表示一個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫着走或豎着走,不能斜着走,要求編程序找出從左上角到右下角的最短路線。
package algorithm_java; import java.util.Scanner; import java.util.Stack; /** * 路徑問題 可以走的最小路徑 */
class Node{ public int x; public int y; Node(int x, int y){ this.x = x; this.y = y; } } public class Labyrinth_Path { public static void main(String[] args){ Scanner scanner = new Scanner(System.in); int labyrinth[][] = new int[5][5]; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { labyrinth[i][j] = scanner.nextInt(); } } judge(labyrinth); } private static void judge(int[][] labyrinth_1) { int[][] dir = {{1, 0}, {0, 1}}; // 行走的方向
Stack<Node> stack = new Stack<>(); // 設置一個棧來存儲信息
int [][] visited = new int[5][5]; // 標記是否被訪問 和labyrinth大小一致
Node start = new Node(0, 0); // 開始的節點信息
Node end = new Node(4, 4); // 結束的位置
visited[start.x][start.y] = 1; // 將起點信息標記為1
stack.push(start); // 將起點信息壓棧
while (!stack.isEmpty()){ // 不為空沒有找到解
boolean flag = false; // 標記是否找了一個方向
Node pek = stack.peek(); if (pek.x == end.x && pek.y == end.y){ break; } else { for (int i = 0; i < 2; i++) { Node nbr = new Node(pek.x + dir[i][0], pek.y + dir[i][1]); // 判斷是否滿足條件
if (nbr.x >= 0 && nbr.x < 5 && nbr.y >= 0 && nbr.y < 5 && labyrinth_1[nbr.x][nbr.y] == 0 && visited[nbr.x][nbr.y] == 0){ stack.push(nbr); visited[nbr.x][nbr.y] = 1; flag = true; break; } } if (flag){ // 找到了方向 就不用執行出棧 一直往下找
continue; } stack.pop(); // 兩個方向都不可以出棧
} } Stack<Node> stackRev = new Stack<>(); // 調整棧的內容
while (!stack.isEmpty()){ stackRev.push(stack.pop()); } while (!stackRev.isEmpty()){ System.out.println("(" + stackRev.peek().x + "," + stackRev.peek().y + " )"); stackRev.pop(); } } }