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

 更新时间:2020年10月26日 12:00:10   作者:tdongmu  
这篇文章主要介绍了java寻找迷宫路径的简单实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

迷宫项目实现设计文档

项目介绍:

一个网格迷宫由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;
    }
  }
  }

到此这篇关于java寻找迷宫路径的简单实现示例的文章就介绍到这了,更多相关java 寻找迷宫路径内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决JPA save()方法null值覆盖掉mysql预设的默认值问题

    解决JPA save()方法null值覆盖掉mysql预设的默认值问题

    这篇文章主要介绍了解决JPA save()方法null值覆盖掉mysql预设的默认值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringMVC Tomcat控制台乱码问题解决方案

    SpringMVC Tomcat控制台乱码问题解决方案

    这篇文章主要介绍了SpringMVC Tomcat控制台乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java中-Xms和-Xmx参数的使用与默认内存设置

    Java中-Xms和-Xmx参数的使用与默认内存设置

    在 Java 程序运行时,内存的管理是影响程序性能的关键因素之一,Java 程序使用的内存主要由两部分组成:堆内存和栈内存,Java 提供了多个参数来控制堆内存的大小,其中最常用的参数是 -Xms 和 -Xmx,本文将详细介绍这些参数,需要的朋友可以参考下
    2024-11-11
  • IE8+SpringMVC文件上传防止JSON下载

    IE8+SpringMVC文件上传防止JSON下载

    这篇文章主要介绍了IE8+SpringMVC文件上传防止JSON下载的相关资料,需要的朋友可以参考下
    2017-07-07
  • Java synchronized关键_动力节点Java学院整理

    Java synchronized关键_动力节点Java学院整理

    在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。下面通过本文给大家介绍synchronized原理 及基本规则,感兴趣的朋友一起学习吧
    2017-05-05
  • Java字典生成算法讲解

    Java字典生成算法讲解

    今天小编就为大家分享一篇关于Java字典生成算法讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java @Validated遇到的大坑与处理

    Java @Validated遇到的大坑与处理

    这篇文章主要介绍了Java @Validated遇到的大坑与处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring Boot Actuator 漏洞利用小结

    Spring Boot Actuator 漏洞利用小结

    spring对应两个版本,分别是Spring Boot 2.x和Spring Boot 1.x,因此后面漏洞利用的payload也会有所不同,这篇文章主要介绍了Spring Boot Actuator 漏洞利用小结,需要的朋友可以参考下
    2023-11-11
  • Java 实现并发的几种方式小结

    Java 实现并发的几种方式小结

    这篇文章主要介绍了Java 实现并发的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • java集合_浅谈Iterable和Iterator的区别

    java集合_浅谈Iterable和Iterator的区别

    下面小编就为大家带来一篇java集合_浅谈Iterable和Iterator的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09

最新评论