使用棧的迷宮算法java版代碼
更新時間:2020年05月27日 09:30:25 作者:young_leez
這篇文章主要為大家詳細介紹了使用棧的迷宮算法java版代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文為大家分享了使用棧的迷宮算法java版,主要考察棧的使用,供大家參考,具體內容如下
主要思路如下:
do { if(當前位置可通過) { 標記此位置已走過; 保存當前位置并入棧; if(當前位置為終點) { 程序結束; } 獲取下一個位置; } else { if(棧非空) { 出棧; while(當前位置方向為4且棧非空) { 標記當前位置不可走; 出棧; } if(當前位置的方向小于4) { 方向+1; 重新入棧; 獲取下一個位置; } } } } while (棧非空);
java代碼如下:
import java.util.Stack; public class Maze { // 棧 private Stack<MazeNode> stack = new Stack<Maze.MazeNode>(); // 迷宮 private int[][] maze = { {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1}, {1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1}, {1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1}, {1,1,1,0,0,1,1,1,1,1,1,0,1,1,0,0,1}, {1,1,0,0,1,0,0,1,0,1,1,1,1,1,1,1,1}, {1,0,0,1,1,1,1,1,1,0,1,0,0,1,0,1,1}, {1,0,0,1,1,1,1,1,1,0,1,0,0,1,0,1,1}, {1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1}, {1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1}, {1,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1}, {1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1}, {1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1}, {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, }; // 標記路徑是否已走過 private int[][] mark = new int[MAZE_SIZE_X][MAZE_SIZE_Y]; private static final int MAZE_SIZE_X = 14; private static final int MAZE_SIZE_Y = 17; private static final int END_X = 12; private static final int END_Y = 15; private void initMark() { for (int i = 0; i < MAZE_SIZE_X; i++) { for (int j = 0; j < MAZE_SIZE_Y; j++) { mark[i][j] = 0; } } } public void process() { initMark(); Position curPos = new Position(1, 1); do { // 此路徑可走 if (maze[curPos.x][curPos.y] == 0 && mark[curPos.x][curPos.y] == 0) { mark[curPos.x][curPos.y] = 1; stack.push(new MazeNode(curPos, 1)); // 已到終點 if (curPos.x == END_X && curPos.y == END_Y) { return; } curPos = nextPos(curPos, stack.peek().direction); } // 走不通 else { if (!stack.isEmpty()) { MazeNode curNode = stack.pop(); while (curNode.direction == 4 && !stack.isEmpty()) { // 如果當前位置的4個方向都已試過,那么標記該位置不可走,并出棧 mark[curNode.position.x][curNode.position.y] = 1; curNode = stack.pop(); } if (curNode.direction < 4) { curNode.direction++;// 方向+1 stack.push(curNode);// 重新入棧 curPos = nextPos(curNode.position, curNode.direction);// 獲取下一個位置 } } } } while(!stack.isEmpty()); } public void drawMaze() { for (int i = 0; i < maze.length; i++) { for (int j = 0; j < maze[0].length; j++) { System.out.print(maze[i][j]); } System.out.print("\n"); } System.out.print("\n"); } public void drawResult() { initMark(); MazeNode node; while (!stack.isEmpty()) { node = stack.pop(); mark[node.position.x][node.position.y] = 1; } for (int i = 0; i < mark.length; i++) { for (int j = 0; j < mark[0].length; j++) { System.out.print(mark[i][j]); } System.out.print("\n"); } System.out.print("\n"); } // 記錄迷宮中的點的位置 class Position { int x; int y; public Position(int x, int y) { this.x = x; this.y = y; } } // 棧中的結點 class MazeNode { Position position; int direction; public MazeNode(Position pos) { this.position = pos; } public MazeNode(Position pos, int dir) { this.position = pos; this.direction = dir; } } // 下一個位置,從右開始,順時針 public Position nextPos(Position position, int direction) { Position newPosition = new Position(position.x, position.y); switch (direction) { case 1: newPosition.y += 1; break; case 2: newPosition.x += 1; break; case 3: newPosition.y -= 1; break; case 4: newPosition.x -= 1; break; default: break; } return newPosition; } public static void main(String[] args) { Maze maze = new Maze(); maze.drawMaze(); maze.process(); maze.drawResult(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
maven如何利用springboot的配置文件進行多個環(huán)境的打包
這篇文章主要介紹了maven如何利用springboot的配置文件進行多個環(huán)境的打包,在Spring Boot中多環(huán)境配置文件名需要滿足application-{profiles.active}.properties的格式,其中{profiles.active}對應你的環(huán)境標識,本文給大家詳細講解,需要的朋友可以參考下2023-02-02使用Java和高德地圖API將經緯度轉換為地理位置信息的步驟
這篇文章詳細介紹了如何將GPS坐標轉換為人類可讀的地理位置,介紹了環(huán)境準備、代碼實現、異常處理及優(yōu)化步驟,首先創(chuàng)建LocationFinder類,實現getLocationFromCoordinates方法,利用高德逆地理編碼API轉換坐標,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-09-09