java寻找迷宫路径的简单实现示例

作者:tdongmu 时间:2021-07-06 13:17:50 

迷宫项目实现设计文档

项目介绍:

一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格。任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外。起点为左上角和终点右下角。

项目功能:

解决迷宫路径查找问题,寻找一条从左上角迷宫入口到右下角迷宫出口的一条有效路径,0代表可走,1代表不能行走,找到请输出最终的迷宫和路径信息,找不到请输出不存在有效路径。

项目所用知识点:

采用Java面向对象思想,二维数组以及非递归栈进行实现

项目实现思路:
1.定义一个迷宫节点类型(MazeNode)的二维数组
2.初始化每个格子中的value值。给二维数组每个格子存放对象。对象的value值只能为0(当前格子可以走)或者1(当前格子不能走)
3.创建围墙,可以有效防止越界问题。根据当前节点周围四个方向格子中的value值,判断当前节点的上下左右四个方向是否可走(0是可走,1不可走)。
4.开始走迷宫。采用栈操作,记录行走的路径,将元素入栈,判断当前栈顶元素的哪个方向可走,将其中一个可走方向进行入栈操作,直到右下角元素停止。栈中保存走过的路径。 注意: 如果遇到走入死胡同问题,此时需要将是栈顶元素并且栈顶元素的四个方向都不能行走,此时将其出栈,选择新方向再次入栈,直到右下角元素停止。

项目实现 :

Maze类


import java.util.Scanner;

public class Maze {
 private MazeNode[][] mazenode;
 private int row ;//行
 private int colum;//列
 public Maze(){

}
 public void innode(){//添加迷宫路径;
   Scanner scanner=new Scanner(System.in);
   System.out.println("请输入迷宫行数和列数");
   row=scanner.nextInt()+2;//为后面加围墙
   colum=scanner.nextInt()+2;
   System.out.println("请输入迷宫路径:");
   mazenode=new MazeNode[row][colum];
   build(mazenode);//创建一个row行colum列的mazenode并且把value值都给1
   for(int i=1;i<row-1;i++){//为围墙内value赋值;
     for(int j=1;j<colum-1;j++){
     mazenode[i][j].value=scanner.nextInt();

}
   }
 }
//创建围墙;
 public void build(MazeNode[][] mazenode){
   for(int i=0;i<row;i++){
     for(int j=0;j<colum;j++){
       mazenode[i][j]=new MazeNode(1,i,j);
     }
   }
 }
 public void goMaze(){//走迷宫
   innode();
   MyStack route=new MyStack();//存放路径的盏
   if(mazenode[1][1].value==0){//判断入口是否可走;
   route.push(mazenode[1][1]);
   }else {System.out.println("迷宫入口路径错误");
   }
   if(mazenode[row-2][colum-2].value!=0){//判断终点是否正确
     System.out.println("迷宫终点错误");
   }
   for(int i=1,j=1;;){//起点
     i=route.gettop().index1;//赋值栈顶元素的下标一给i
     j=route.gettop().index2;//赋值栈顶元素的下标二给j
     if(i==row-2&&j==colum-2){
       break;
     }//抵达终点退出循环
       if(mazenode[i][j].right(mazenode,i,j+1)){//判断右边是否可走
         if(route.contain(route,mazenode,i,j+1)){//判断右边是否在栈内
           mazenode[i][j].changeValue(mazenode,i,j);
           route.pop(mazenode[i][j]);//如果存在退栈
         }else {
         route.push(mazenode[i][j+1]);//如果不存在入栈的右边
         }
       } else if(i+1<row&&mazenode[i][j].down(mazenode,i+1,j)){
         if(route.contain(route,mazenode,i+1,j)){//判断下边是否在栈内
           mazenode[i][j].changeValue(mazenode,i,j);
           route.pop(mazenode[i+1][j]);退栈
         }else {
         route.push(mazenode[i+1][j]);
         }
       }else if(i+1<row&&mazenode[i][j].left(mazenode,i,j-1)){
         if(route.contain(route,mazenode,i,j-1)){//判断左边是否在栈内
           mazenode[i][j].changeValue(mazenode,i,j);
           route.pop(mazenode[i][j]);退栈
         }else{
         route.push(mazenode[i][j-1]);
         }
       }else if(i+1<row&&mazenode[i][j].up(mazenode,i-1,j)){
         if(route.contain(route,mazenode,i-1,j)){//判断上边是否在栈内
           mazenode[i][j].changeValue(mazenode,i,j);
           route.pop(mazenode[i][j]);退栈
         }else{
         route.push(mazenode[i-1][j]);
         }
       }
   }
   route.toRoute();//修改路径的值
   for(int i=1;i<row-1;i++){//进行打印
     for(int j=1;j<colum-1;j++){
       System.out.print(mazenode[i][j].value+" ");
     }
     System.out.println();
   }
 }
}

mazenode类


public class MazeNode {
 public int index1;
 public int index2;
 public int value;
 public MazeNode(int value,int index1,int index2) {
   this.value=value;
   this.index1=index1;//下标1
   this.index2=index2;//下标2
 }
 //改变找个点的值为2
 public void changeValue(MazeNode[][] mazeNode,int index1,int index2){

mazeNode[index1][index2].value=2;
 }
 //判断左边是否可走
 public boolean left(MazeNode[][] mazeNode,int index1,int index2){
   if(mazeNode[index1][index2].value==0){
   return true;
   }return false;
 }
 //判断上边是否可走
 public boolean up(MazeNode[][] mazeNode,int index1,int index2){
   if(mazeNode[index1][index2].value==0){
     return true;
   }return false;
 }
 //判断右边是否可走
 public boolean right(MazeNode[][] mazeNode,int index1,int index2){
   if(mazeNode[index1][index2].value==0){
     return true;
   }return false;
 }
 //判断下边是否可走
 public boolean down(MazeNode[][] mazeNode,int index1,int index2){
   if(mazeNode[index1][index2].value==0){
     return true;
   }return false;
 }
}

MyStake类//栈


import java.util.Arrays;
import java.util.EmptyStackException;

public class MyStack {
 private PuzzleValue[]array2;
 private MazeNode[]array;
 private int size;
 private final int INITSIZE=10;
 public MyStack(){
   array=new MazeNode[INITSIZE];
   array2=new PuzzleValue[INITSIZE];

}
 //查找栈内是否存在此路径
 public boolean contain(MyStack stack,MazeNode[][] mazeNode,int index1,int index2){

for(int i=0;i<size;i++){
     if(array[i].index1==index1&&array[i].index2==index2){
       return true;
     }
     }
   return false;
 }
 //入栈
 public void push(MazeNode mazeNode){
   if(array.length==size){
     array= Arrays.copyOf(array,array.length+(array.length>>1));
   }else {
   array[size]=mazeNode;
   size++;
   }
 }
 //出栈
 public void pop(MazeNode mazeNode){
   if(size==0){
     return;
   }else{
     array[size]=null;
     size--;
   }

}
 //获得栈顶元素
 public MazeNode gettop(){
   return array[size-1];
 }
 //改变栈内的value值
 public void toRoute(){
   for(int i=0;i<size;i++){
     array[i].value=3;
   }
 }
 }

来源:https://blog.csdn.net/tdongmu/article/details/109275211

标签:java,寻找迷宫路径
0
投稿

猜你喜欢

  • springboot 正确的在异步线程中使用request的示例代码

    2023-11-24 22:36:13
  • synchronized背后的monitor锁实现详解

    2023-07-31 08:14:10
  • Spring如何使用@Indexed加快启动速度

    2022-05-02 10:50:40
  • Java获取控制台输入的两种方法小结

    2023-11-29 12:40:44
  • 解决Eclipse创建android项目无法正常预览布局文件问题的方法

    2023-07-31 09:51:12
  • Spring @Retryable注解轻松搞定循环重试功能

    2022-12-17 06:07:51
  • java多线程实现下载图片并压缩

    2023-01-17 22:28:34
  • android6.0权限动态申请框架permissiondispatcher的方法

    2023-07-31 10:51:57
  • ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    2023-11-27 01:26:57
  • 了解Java线程池创建过程

    2022-09-29 20:45:49
  • springboot如何使用logback-spring配置日志格式,并分环境配置

    2023-11-10 04:37:34
  • ActiveMQ结合Spring收发消息的示例代码

    2023-11-24 06:01:12
  • 带你了解Java常用类小结

    2023-04-15 14:38:26
  • 关于springboot集成阿里云短信的问题

    2023-08-23 09:46:15
  • 浅谈springboot之JoinPoint的getSignature方法

    2022-12-25 11:23:20
  • 详解Spring中bean的几种注入方式

    2023-02-12 20:25:07
  • 详解Java程序启动时-D指定参数是什么

    2021-10-22 07:35:34
  • SpringBoot使用@ResponseBody返回图片的实现

    2023-11-28 04:41:24
  • JDK1.8下载、安装和环境配置超详细教程(最新最完整)

    2022-07-22 12:58:34
  • 详解spring中的Aware接口功能

    2023-07-02 00:36:01
  • asp之家 软件编程 m.aspxhome.com