欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用棧的迷宮算法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();
 }

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java接口使用默認方法的講解

    java接口使用默認方法的講解

    在本篇文章里小編給大家整理了一篇關于java接口使用默認方法的講解內容,有需要的朋友們可以學習下。
    2021-04-04
  • SpringSecurity構建基于JWT的登錄認證實現

    SpringSecurity構建基于JWT的登錄認證實現

    這篇文章主要介紹了SpringSecurity構建基于JWT的登錄認證實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • SpringBoot應用快速部署到K8S的詳細教程

    SpringBoot應用快速部署到K8S的詳細教程

    這篇文章主要介紹了SpringBoot應用快速部署到K8S的詳細教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • SpringMVC實現前端后臺交互傳遞數據

    SpringMVC實現前端后臺交互傳遞數據

    本篇文章主要介紹了SpringMVC實現前端后臺傳遞數據的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • maven如何利用springboot的配置文件進行多個環(huán)境的打包

    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將經緯度轉換為地理位置信息的步驟

    使用Java和高德地圖API將經緯度轉換為地理位置信息的步驟

    這篇文章詳細介紹了如何將GPS坐標轉換為人類可讀的地理位置,介紹了環(huán)境準備、代碼實現、異常處理及優(yōu)化步驟,首先創(chuàng)建LocationFinder類,實現getLocationFromCoordinates方法,利用高德逆地理編碼API轉換坐標,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • java實現上傳網絡圖片到微信臨時素材

    java實現上傳網絡圖片到微信臨時素材

    這篇文章主要為大家詳細介紹了java實現上傳網絡圖片到微信臨時素材,網絡圖片上傳到微信服務器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Springboot mybatis常見配置問題解決

    Springboot mybatis常見配置問題解決

    這篇文章主要介紹了Springboot mybatis常見配置問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 使用@Value注入map、List,yaml格式方式

    使用@Value注入map、List,yaml格式方式

    這篇文章主要介紹了使用@Value注入map、List,yaml格式方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 淺談@Value和@Bean的執(zhí)行順序問題

    淺談@Value和@Bean的執(zhí)行順序問題

    這篇文章主要介紹了@Value和@Bean的執(zhí)行順序問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論