Java项目实现寻找迷宫出路

作者:Sampson_S 时间:2022-10-05 14:08:46 

本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下

项目名称

寻找迷宫出路

项目描述

给定一个自定义迷宫,0表示能通过,1表示不能通过。通过程序找出正确的迷宫出路,并将正确的路线改为2输出。

Java项目实现寻找迷宫出路

代码实现

测试类


public class Test {
public static void main(String[] args) {
 Maze maze = new Maze();
 maze.begin();
}
}

主类:实现主方法


public class Maze {
private MazeNode[][] mazeNodes;
private int row;
private int col;
private Stack<MazeNode> stack = new Stack<>();
private static Scanner scanner = new Scanner(System.in);

public Maze(){
 System.out.println("请输入行列数");
 row = scanner.nextInt();
 col = scanner.nextInt();
 mazeNodes = new MazeNode[row][col];
}
public void initValue(){
 System.out.println("输入迷宫路径:");
 for(int i=0;i<row;i++){
  for(int j=0;j<col;j++){
   // i j
   mazeNodes[i][j] = new MazeNode(scanner.nextInt(),i,j);
  }
 }
}
//2. 根据当前节点的四个方向上面的value值
// 初始化当前节点的四个方向行走状态
public void initWayState(){
 for(int i=0;i<row;i++){
  for(int j=0;j<col;j++){
   //i j
   if(mazeNodes[i][j].getValue()==0){
    //东 :看东边节点的值是0
    if(j+1<col && mazeNodes[i][j+1].getValue() == 0){
     // 将当前节点i j 的东边方向设置成可走状态
     mazeNodes[i][j].setWayState(Constant.WAY_EAST,Constant.WAY_ABLE);
    }
    //西
    if(j-1>0 && mazeNodes[i][j-1].getValue() == 0){
     mazeNodes[i][j].setWayState(Constant.WAY_WEST,Constant.WAY_ABLE);
    }
    //南
    if(i+1<row && mazeNodes[i+1][j].getValue() == 0){
     mazeNodes[i][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_ABLE);
    }
    //北
    if(i-1>0 && mazeNodes[i-1][j].getValue() == 0){
     mazeNodes[i][j].setWayState(Constant.WAY_NORTH,Constant.WAY_ABLE);
    }
   }
  }
 }
}
//走迷宫
public void goMaze(){
 if(mazeNodes[0][0].getValue()!=0){
  System.out.println("没有迷宫路径");
  return;
 }
 stack.push(mazeNodes[0][0]);
 while (!stack.isEmpty()) {//TODO:??????
  MazeNode top = stack.peek();
  //获取当前栈顶元素在二维数组中的行列坐标
  int i = top.getI();
  int j = top.getJ();
  if(i == row-1 && j==col-1){
   System.out.println("找到迷宫路径");
   return;
  }
  //TODO:
  if(mazeNodes[i][j].getWayState(Constant.WAY_SOUTH) == Constant.WAY_DISABLE &&
    mazeNodes[i][j].getWayState(Constant.WAY_EAST) == Constant.WAY_DISABLE &&
    mazeNodes[i][j].getWayState(Constant.WAY_NORTH) == Constant.WAY_DISABLE &&
    mazeNodes[i][j].getWayState(Constant.WAY_WEST) == Constant.WAY_DISABLE){
   stack.pop();
  }
  //东
  else if (mazeNodes[i][j].getWayState(Constant.WAY_EAST)) {
   stack.push(mazeNodes[i][j + 1]);
   mazeNodes[i][j+1].setWayState(Constant.WAY_WEST,Constant.WAY_DISABLE);
   mazeNodes[i][j].setWayState(Constant.WAY_EAST,Constant.WAY_DISABLE);
  }//南
  else if (mazeNodes[i][j].getWayState(Constant.WAY_SOUTH)) {
   //如果南边方向可走,将南边节点进行入栈操作
   stack.push(mazeNodes[i + 1][j]);
   //封路1:将南边节点的回路(北边)方向封掉
   mazeNodes[i+1][j].setWayState(Constant.WAY_NORTH,Constant.WAY_DISABLE);
   //封路2:将当前节点i,j 走过的路封掉 TODO:
   mazeNodes[i][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_DISABLE);
  }
  //西
  else if (mazeNodes[i][j].getWayState(Constant.WAY_WEST)) {
   stack.push(mazeNodes[i][j - 1]);
   mazeNodes[i][j-1].setWayState(Constant.WAY_EAST,Constant.WAY_DISABLE);
   mazeNodes[i][j].setWayState(Constant.WAY_WEST,Constant.WAY_DISABLE);
  }
  //北
  else if (mazeNodes[i][j].getWayState(Constant.WAY_NORTH)) {
   stack.push(mazeNodes[i - 1][j]);
   mazeNodes[i-1][j].setWayState(Constant.WAY_SOUTH,Constant.WAY_DISABLE);
   mazeNodes[i][j].setWayState(Constant.WAY_NORTH,Constant.WAY_DISABLE);
  }
//   if(mazeNodes[i][j].getWayState(Constant.WAY_SOUTH) == Constant.WAY_DISABLE &&
//     mazeNodes[i][j].getWayState(Constant.WAY_EAST) == Constant.WAY_DISABLE &&
//     mazeNodes[i][j].getWayState(Constant.WAY_NORTH) == Constant.WAY_DISABLE &&
//     mazeNodes[i][j].getWayState(Constant.WAY_WEST) == Constant.WAY_DISABLE){
//    stack.pop();
//   }
 }
}
public void finish(){
 while (!stack.isEmpty()) {
  MazeNode top = stack.peek();
  top.setValue(2);
  stack.pop();
 }
 System.out.println("迷宫路径为:");
 int i = 0, j = 0;
 while (i<row){
  for (j = 0; j < col; j++) {
   System.out.print(mazeNodes[i][j].getValue()+" ");
  }
  System.out.println();
  i++;
 }
}
public void begin(){
 initValue();
 initWayState();
 goMaze();
 finish();
}

// public void show(){
//  for(int i=0;i<row;i++){
//   for(int j=0;j<colum;j++){
//    System.out.print(mazeNodes[i][j].value+" ");
//   }
//   System.out.println();
//  }
// }
}

MazeNode:结点类,用于迷宫结点


public class MazeNode {
private int i;
private int j;
private int value;
private boolean[] wayState;
public MazeNode(int value,int i,int j){
 wayState = new boolean[Constant.WAYNUM];
 this.value = value;
 this.i = i;
 this.j = j;
}

public int getValue() {
 return value;
}

public void setWayState(int direction,boolean isAble) {
 wayState[direction] = isAble;
}

public boolean getWayState(int direction) {
 return wayState[direction];
}

public void setValue(int value){
 this.value = value;
}

public int getI() {
 return i;
}

public int getJ() {
 return j;
}
}

Constant:常数类,方便使用


public class Constant {
public static final int WAYNUM = 4;
public static final int WAY_EAST = 0;
public static final int WAY_WEST = 1;
public static final int WAY_SOUTH = 2;
public static final int WAY_NORTH = 3;
public static final boolean WAY_ABLE = true;
public static final boolean WAY_DISABLE = false;
}

来源:https://blog.csdn.net/Sampson_S/article/details/105166802

标签:java,迷宫
0
投稿

猜你喜欢

  • Android实现ImageView图片缩放和拖动

    2022-09-07 09:19:52
  • Ubuntu 安装 JDK8 的两种方法(总结)

    2021-07-04 04:36:40
  • C#程序执行时间长查询速度慢解决方案

    2023-10-31 08:49:05
  • Flutter开发Mac桌面应用实现自动提取生成视频字幕文件

    2023-05-11 05:25:58
  • C#和vb.net实现PDF 添加可视化和不可见数字签名

    2022-08-01 12:49:02
  • Android连接MySQL数据库并进行增删改查操作示例讲解

    2023-07-03 13:20:15
  • Java安全框架——Shiro的使用详解(附springboot整合Shiro的demo)

    2022-05-29 09:46:46
  • Android开发之android_gps定位服务简单实现

    2023-07-31 20:02:25
  • java迭代器原理及迭代map的四种方式

    2021-08-27 12:04:30
  • Logger.error打印错误异常的详细堆栈信息

    2022-01-06 23:03:04
  • c#读写App.config,ConfigurationManager.AppSettings 不生效的解决方法

    2021-10-07 22:34:42
  • java调用python脚本引入第三方库失败的实现

    2021-10-16 02:36:25
  • Android广播实现App开机自启动

    2023-01-06 14:54:44
  • java和c#使用hessian通信的方法

    2021-12-12 22:03:46
  • C#使用正则表达式

    2021-11-16 18:33:57
  • C# PDF转图片(JPG,Png)的项目实践

    2021-11-10 17:59:24
  • Java实现复制文件并命名的超简洁写法

    2022-02-12 12:54:06
  • android,不显示标题的方法小例子

    2023-07-10 17:14:36
  • Android实现蓝牙聊天功能

    2023-06-10 01:19:48
  • 初识Java基础之数据类型与运算符

    2021-10-13 12:20:32
  • asp之家 软件编程 m.aspxhome.com