Java项目实现寻找迷宫出路

 更新时间:2020年05月27日 09:35:57   作者:Sampson_S  
这篇文章主要为大家详细介绍了Java项目实现寻找迷宫出路,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

项目名称

寻找迷宫出路

项目描述

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

代码实现

测试类

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;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • java.sql.SQLException问题解决以及注意事项

    java.sql.SQLException问题解决以及注意事项

    这篇文章主要给大家介绍了关于java.sql.SQLException问题解决以及注意事项的相关资料,这个问题其实很好解决,文中通过图文将解决的办法介绍的很详细,需要的朋友可以参考下
    2023-07-07
  • SpringCloud超详细讲解微服务网关Gateway

    SpringCloud超详细讲解微服务网关Gateway

    这篇文章主要介绍了SpringCloud Gateway微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringSecurity实现动态url拦截(基于rbac模型)

    SpringSecurity实现动态url拦截(基于rbac模型)

    本文主要介绍了SpringSecurity动态url拦截,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • LeetCode -- Path Sum III分析及实现方法

    LeetCode -- Path Sum III分析及实现方法

    这篇文章主要介绍了LeetCode -- Path Sum III分析及实现方法的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • Spring中的Aware接口详细解析

    Spring中的Aware接口详细解析

    这篇文章主要介绍了Spring中的Aware接口详细解析,Aware是一个具有标识作用的超级接口,具体实现是有子接口去决定的,但是子接口至少要有一个带一个参数的且返回是空的方法,需要的朋友可以参考下
    2023-12-12
  • Druid连接池未关闭导致内存泄漏问题

    Druid连接池未关闭导致内存泄漏问题

    这篇文章主要介绍了Druid连接池未关闭导致内存泄漏问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Kafka消费客户端协调器GroupCoordinator详解

    Kafka消费客户端协调器GroupCoordinator详解

    这篇文章主要为大家介绍了Kafka消费客户端协调器GroupCoordinator使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 解析Java并发Exchanger的使用

    解析Java并发Exchanger的使用

    Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。两个线程都调用exchange方法之后,传入的参数就会交换。
    2021-06-06
  • springboot中使用mybatisplus自带插件实现分页的示例代码

    springboot中使用mybatisplus自带插件实现分页的示例代码

    这篇文章主要介绍了springboot中使用mybatisplus自带插件实现分页,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • 详解java接口(interface)在不同JDK版本中的变化

    详解java接口(interface)在不同JDK版本中的变化

    这篇文章主要介绍了详解java接口(interface)在不同JDK版本中的变化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论