棧和隊列是java編程中常用的數據結構,在迷宮問題中也可以被應用。這里講解如何使用棧和隊列實現迷宮代碼。
首先需要定義一個迷宮類Maze,該類主要包括迷宮地圖的構建以及尋找路徑的方法。迷宮地圖可以用二維數組表示,其中0表示可以通行的路,1表示障礙物??梢栽跇嬙旌瘮抵袀魅胍粋€二維數組作為迷宮地圖。
public class Maze { private int[][] map; public Maze(int[][] map) { this.map = map; } }
接下來就是尋找路徑的方法。由于使用棧和隊列都可以實現,這里選用隊列實現。首先定義一個Point類,用于存儲每個點的坐標。然后定義一個隊列表示需要走的所有點,以及定義一個visited數組表示該點是否已經走過。
public class Point { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } } public void findPath() { Queuequeue = new LinkedList<>(); boolean[][] visited = new boolean[map.length][map[0].length]; }
接下來就是不斷取隊列中的點,進行廣度優先搜索。對于每個點,先判斷是否到達終點,如果是則返回路徑;否則判斷該點是否可走且未走過,如果是則將該點加入隊列中,并將該點標記為已走過。
public void findPath() { Queuequeue = new LinkedList<>(); boolean[][] visited = new boolean[map.length][map[0].length]; Point start = new Point(0, 0); Point end = new Point(map.length - 1, map[0].length - 1); queue.offer(start); visited[start.x][start.y] = true; while (!queue.isEmpty()) { Point cur = queue.poll(); if (cur.x == end.x && cur.y == end.y) { //到達終點,返回路徑 } else { if (cur.x - 1 >= 0 && map[cur.x - 1][cur.y] == 0 && !visited[cur.x - 1][cur.y]) { Point next = new Point(cur.x - 1, cur.y); //入隊并標記為已走過 } if (cur.x + 1< map.length && map[cur.x + 1][cur.y] == 0 && !visited[cur.x + 1][cur.y]) { Point next = new Point(cur.x + 1, cur.y); //入隊并標記為已走過 } if (cur.y - 1 >= 0 && map[cur.x][cur.y - 1] == 0 && !visited[cur.x][cur.y - 1]) { Point next = new Point(cur.x, cur.y - 1); //入隊并標記為已走過 } if (cur.y + 1< map[0].length && map[cur.x][cur.y + 1] == 0 && !visited[cur.x][cur.y + 1]) { Point next = new Point(cur.x, cur.y + 1); //入隊并標記為已走過 } } } }
最后實現返回路徑的方法。可以使用一個HashMap來存儲每個點的前驅節點,從終點開始回溯到起點。
public ListgetPath(Point start, Point end, HashMap map) { List path = new ArrayList<>(); Point cur = end; while (!cur.equals(start)) { path.add(cur); cur = map.get(cur); } path.add(start); Collections.reverse(path); return path; }
至此,使用隊列實現迷宮代碼的方法已經完成。