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 寻找迷宫路径内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现走迷宫回溯算法

    以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. (1) 根据二维数组,输出迷宫的图形. (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径. 例子: 左上角(1,1)为入口,右下角(8,9)为出口. 可使用回溯方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进:否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通

  • Java项目实现寻找迷宫出路

    本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下 项目名称 寻找迷宫出路 项目描述 给定一个自定义迷宫,0表示能通过,1表示不能通过.通过程序找出正确的迷宫出路,并将正确的路线改为2输出. 代码实现 测试类 public class Test { public static void main(String[] args) { Maze maze = new Maze(); maze.begin(); } } 主类:实现主方法 public class Maze

  • java实现单词搜索迷宫游戏

    本文实例讲述了java实现单词搜索迷宫游戏.分享给大家供大家参考.具体分析如下: 我们在杂志上,经常能够看到找单词的小游戏,在一个二维表格中,存在各种字母,我们可以从八个方向找单词.这个用计算机处理十分方便,但是,算法的好坏很重要,因为要是用蛮力算法实现,那么耗费的时间是不可想象的. 这是数据结构与问题求解Java语言描述一书中给的实现思路 完整代码如下,注释写的很明白了 import java.io.BufferedReader; import java.io.FileReader; impo

  • java图的深度优先遍历实现随机生成迷宫

    最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢. 1.从任意一点开始访问(我的算法中固定是从(0,0)点开始),往四个方向中的随机一个访问(每访问到一个可访问的点,就去掉该点的那个方向的墙),被访问点继续以这种方识向下进行访问. 2.对每个被访问的点都被标识为已访问,当一个点对某个方向进行访问时我们首先会判断被访问点是否已被访问,或者触到边界.如果该点四个方向皆已访

  • java 实现迷宫回溯算法示例详解

    用一个7 x 7的矩形表示迷宫,0和1分别表示的是通路和障碍.通过设计编写程序找到蓝色小球达到蓝色旗子的路线 思路: 构建一个迷宫(用二维数组)实现找通路的方法findRoad() 构建二维数组不难,我们主要是要实现findRoad()这个方法,在实现这个方法前,我们需要约定好一下几个点:小球的位置当作入口(1,1),小旗的位置当作出口(5,5)数组里数的含义分别为(0没有走过).(1障碍).(2走过且为正确的路线).(3走过且为错误的路线)将我们每一步的走法称为策略:下 -> 右 -> 上

  • Java基于深度优先遍历的随机迷宫生成算法

    这两天因为要做一个随机的地图生成系统,所以一直在研究随机迷宫生成算法,好吧,算是有一点小小的成果. 随机迷宫生成我自己的理解简而言之分为以下几步: 1.建立一张地图,我用的二维数组表示,地图上全是障碍物.然后再创建一个用来表示每个格子是否被访问过的二维数组.再创建一个用来表示路径的栈结构. 2.随机选择地图上的一点,呃为了方便我初始点直接取的是左上角即坐标表示为0,0的格子.终点的话因为不涉及到交互就暂时没有. 3.查找当前格子的邻接格(注意,这里的邻接格子都是还未被访问的,下面的代码里有写).

  • Java遗传算法之冲出迷宫

    遗传算法是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法.它能解决很多问题,比如数学方程的最大最小值,背包问题,装箱问题等.在游戏开发中遗传算法的应用也十分频繁,不少的游戏 AI 都利用遗传算法进行编码. 就个人理解,遗传算法是模拟神奇的大自然中生物"优胜劣汰"原则指导下的进化过程,好的基因有更多的机会得到繁衍,这样一来,随着繁衍的进行,生物种群会朝着一个趋势收敛.而生物繁衍过程中的基因杂交和变异会给种群提供更好的基因序列

  • Java编写迷宫小游戏

    缘起: 去年(大三上学期)比较喜欢写小游戏,于是想试着写个迷宫试一下. 程序效果: 按下空格显示路径: 思考过程: 迷宫由一个一个格子组成,要求从入口到出口只有一条路径. 想了一下各种数据结构,似乎树是比较合适的,从根节点到每一个子节点都只有一条路径.假设入口是根节点,出口是树中某个子节点,那么,从根节点到该子节点的路径肯定是唯一的. 所以如果能构造一棵树把所有的格子都覆盖到,也就能够做出一个迷宫了. 另外还要求树的父节点和子节点必须是界面上相邻的格子. 在界面显示时,父节点和子节点之间共用的边

  • 使用栈的迷宫算法java版代码

    本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下 主要思路如下: do { if(当前位置可通过) { 标记此位置已走过; 保存当前位置并入栈; if(当前位置为终点) { 程序结束; } 获取下一个位置; } else { if(栈非空) { 出栈: while(当前位置方向为4且栈非空) { 标记当前位置不可走; 出栈; } if(当前位置的方向小于4) { 方向+1; 重新入栈; 获取下一个位置; } } } } while (栈非空); java代码

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

    迷宫项目实现设计文档 项目介绍: 一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示).你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格.任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外.起点为左上角和终点右下角. 项目功能: 解决迷宫路径查找问题,寻找一条从左上角迷宫入口到右下角迷宫出口的一条有效路径,0代表可走,1代表不能行走,找到请输出最终的迷宫和路径信息,找不到请输出不存在有效路径. 项目所用知识点: 采用Java面

  • Java绘制迷宫动画并显示的示例代码

    一次性全部绘制出来 实现代码 import java.awt.*; public class AlgoVisualizer { private static int DELAY = 200; private static int blockSide = 8; private MazeData data; private AlgoFrame frame; public AlgoVisualizer(String mazeFile){ // 初始化数据 data = new MazeData(maz

  • Java分别利用深度优先和广度优先求解迷宫路径

    目录 深度优先 实现效果 示例代码 广度优先 实现效果 示例代码 知识点总结 深度优先 实现效果 示例代码 import java.awt.*; import javax.swing.*; public class AlgoFrame extends JFrame{ private int canvasWidth; private int canvasHeight; public AlgoFrame(String title, int canvasWidth, int canvasHeight)

  • Java线程安全的计数器简单实现代码示例

    前几天工作中一段业务代码需要一个变量每天从1开始递增.为此自己简单的封装了一个线程安全的计数器,可以让一个变量每天从1开始递增.当然了,如果项目在运行中发生重启,即便日期还是当天,还是会从1开始重新计数.所以把计数器的值存储在数据库中会更靠谱,不过这不影响这段代码的价值,现在贴出来,供有需要的人参考. package com.hikvision.cms.rvs.common.util; import java.text.SimpleDateFormat; import java.util.Arr

  • Java Spring开发环境搭建及简单入门示例教程

    本文实例讲述了Java Spring开发环境搭建及简单入门示例.分享给大家供大家参考,具体如下: 前言 虽然之前用过Spring,但是今天试着去搭建依然遇到了困难,而且上网找教程,很多写的是在web里使用Spring MVC的示例,官方文档里的getting start一开始就讲原理去了(可能打开的方法不对).没办法,好不容易实验成功了,记下来免得自己以后麻烦. 添加依赖包 进入spring官网,切换到projects下点击 spring framework.官网上写的是以maven依赖的形式写

  • Java编程异常简单代码示例

    练习1 写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形.如果不能则抛出异常IllegalArgumentException,显示异常信息:a,b,c "不能构成三角形":如果可以构成则显示三角形三个边长.在主方法中得到命令行输入的三个整数,调用此方法,并捕获异常. 两边之和大于第三边:a+b>c 两边之差小于第三边:c-a package 异常; import java.util.Arrays; import java

  • Java中闭包简单代码示例

    一.闭包的定义. 有很多不同的人都对闭包过进行了定义,这里收集了一些. # 是引用了自由变量的函数.这个函数通常被定义在另一个外部函数中,并且引用了外部函数中的变量. -- <<wikipedia>> # 是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域.-- <<Java编程思想>> # 是一个匿名的代码块,可以接受参数,并返回一个返回值,也可以引用和使用在它周围的,可见域中定义的变量.-- Groovy ['ɡru:vi] # 是一个表

  • Java实现判断浏览器版本与类型简单代码示例

    简单的Java获取浏览器版本和类型方法,不是很完美,但是可以用: 希望大家加以完善! public static void main(String[] args) { String agent=request.getHeader("User-Agent").toLowerCase(); System.out.println(agent); System.out.println("浏览器版本:"+getBrowserName(agent)); } public Str

随机推荐