使用棧的迷宮演算法java版代碼,迷宮演算法java代碼

來源:互聯網
上載者:User

使用棧的迷宮演算法java版代碼,迷宮演算法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();  }}

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.