迷宫

用0表示可以走,1表示不可以走,从左上角走到右下角,能否找到一条路,如果找到,那么打印出来路径,用2表示走过的路径

如果找不到,那么图中尝试过的点置为 -1.

程序运行如下

输出如下

我的主要思路,首先用一个Maze类来表示迷宫上面的点,类中包含点的横纵坐标和点的值,用栈保存迷宫路径。从入口到出口,依次按照右 下 左 上判断四周是否是通路,如果是,将判断的点入栈,并将值置为2,如果四周都没有通路,那么当前点出栈,将值置为-1.
成功的条件是到达终点(即右下角的点),
失败的条件是:
       1.开始值不是0
       2.栈为空,表示没有路径。

实现的完整代码

Maze.java代码

public class Maze {private int x;private int y;private int value;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Maze(){}public Maze(int x,int y,int value){this.x = x;this.y = y;this.value = value;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}
}

这里我没有用jdk提供的栈,自己学着写了一个简单的栈。

MyStack.java代码

public class MyStack {private final static int MAXSIZE = 10;private int top;private Maze[] mazes;public Maze getMazes(int i) {return mazes[i];}public void setMazes(Maze[] mazes) {this.mazes = mazes;}public int getTop() {return top;}public void setTop(int top) {this.top = top;}public MyStack(){top = -1;               //栈首下标mazes = new Maze[MAXSIZE];}//判栈空public boolean isEmpty(){if (top == -1){return true;}return false;}//栈溢出public boolean isFull(){if (top == MAXSIZE){return true;}return false;}//出栈public void pop(){top--;}//入栈public void push(Maze maze){top++;mazes[top] = maze;}public void printStack(){for (int i=0;i<=top;i++){System.out.println("("+mazes[i].getX()+","+mazes[i].getY()+")");}}
}

用MazeGame类表示一个迷宫,来保存所有的点,start()方法开始找入口,如果入口也就是(0,0)点不是0,那么没有路径,输出no way.否则表示可以进入,将(0,0)点入栈。road方法是主要实现代码,首先判栈空,如果栈是空的,那么表示没有可以走通的路径,用temp保存当前栈顶元素。startX,startY保存当前的横纵坐标。
       如果栈不空,判断当前迷宫点是否是终点,是终点游戏结束。不是终点开始判断是否有路径可以走,如果没有,该迷宫点出栈,用-1表示当前点已经走过。如果有,按照右 下 左 上的顺序依次判断,可以走,将该迷宫点入栈。

MazeGame.java代码

public class MazeGame {private Maze[][] mazes;public MazeGame(Maze[][] mazes){this.mazes = mazes;}public void start(){int startX = 0;int startY = 0;MyStack stack = new MyStack();mazeGamePrint();if (mazes[startX][startY].getValue() == 0){              // 入口是否为0stack.push(mazes[startX][startY]);mazes[startX][startY].setValue(2);                  //将以走过的路径置为2}else{System.out.println("no way");return ;}if(road(stack)){stack.printStack();mazeGamePrint();}else{System.out.println("no way!");mazeGamePrint();}}private boolean road(MyStack stack) {while(!stack.isEmpty()){int temp = stack.getTop();                              //栈顶元素int startX = stack.getMazes(temp).getX();int startY = stack.getMazes(temp).getY();if (startX == mazes.length-1 && startY == mazes[0].length-1){       //到达终点System.out.println("路径走过的坐标");return true;}else if (hasRoad(stack,startX,startY)){                                              //没有到达终点 且有路可走if(startY<mazes[0].length-1 && mazes[startX][startY+1].getValue() == 0){       //向右stack.push(mazes[startX][startY+1]);mazes[startX][startY+1].setValue(2);} else if (startX < mazes.length-1 && mazes[startX+1][startY].getValue() == 0){       //向下stack.push(mazes[startX+1][startY]);mazes[startX+1][startY].setValue(2);}else if (startY > 0 && mazes[startX][startY-1].getValue() == 0){       //向左stack.push(mazes[startX][startY-1]);mazes[startX][startY-1].setValue(2);} else if (startX > 0 && mazes[startX-1][startY].getValue() == 0){   //向上stack.push(mazes[startX-1][startY]);mazes[startX-1][startY].setValue(2);}}else{stack.pop();mazes[startX][startY].setValue(-1);}}return false;}private boolean hasRoad(MyStack stack,int startX,int startY) {if (startY<mazes[0].length-1 && mazes[startX][startY+1].getValue() == 0 ||startX < mazes.length-1 && mazes[startX+1][startY].getValue() == 0 ||startX > 0 && mazes[startX-1][startY].getValue() == 0 ||startY > 0 && mazes[startX][startY-1].getValue() == 0){return true;}return false;}public void mazeGamePrint(){for (int i=0;i<mazes.length;i++){for (int j=0;j<mazes[0].length;j++){System.out.print(mazes[i][j].getValue()+" ");}System.out.println();}}
}

测试代码Test.java

public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入迷宫的行列数(m * n):");int m = scanner.nextInt();int n = scanner.nextInt();Maze[][] mazes = new Maze[m][n];System.out.println("请输入迷宫的路径");for (int i=0;i<m;i++){for (int j=0;j<n;j++){mazes[i][j] = new Maze(i,j,scanner.nextInt());}}/*Maze[][] mazes = new Maze[][]{{new Maze(0,0,0),new Maze(0,1,1),new Maze(0,2,0)},{new Maze(1,0,0),new Maze(1,1,0),new Maze(1,2,0)},{new Maze(2,0,1),new Maze(2,1,0),new Maze(2,2,0)}};*/MazeGame mazeGame = new MazeGame(mazes);mazeGame.start();}
}

Java用栈简单实现迷宫相关推荐

  1. 探究Java虚拟机栈

    前言 Java 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟机栈和本地方法栈,以及程序计数器这一小部分内存.今天我就 Java 虚拟机栈做 ...

  2. java进出栈_JVM函数调用:Java出入栈

    JVM函数调用:Java出入栈 JVM函数调用:Java出入栈 目录 局部变量表 索引复用 垃圾回收 栈数据区 栈上分配 线程作为系统运算调度的最小单位,在JVM中线程的行为体现就是函数调用,函数调用 ...

  3. java 取栈顶元素_《Java实战之内存模型》详解篇

    内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行 JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JVM的高效稳定运行 不同的JV ...

  4. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  5. java 前端工作内容_java前端、java后端、java全栈工作主要内容是什么?哪个薪资高?...

    摘要 最近,听了一场关于java全栈工程师职位的简介说明,里面很清楚的说明了一下前端,后端,全栈都是做什么工作的.其实,想做这个行业,就应该了解职能以及技能需求,这样学习才能更高效.我知道一些刚刚入行 ...

  6. java将dxf展示在网页_七天串起java技术栈-第四天

    上期回顾与本期预告: 昨天,我们从一个页面出发,搞清楚了前端,后端,接口的概念.并且还引出了servlet与tomcat. 今天,继续我们的探索之旅,看看又会接触到什么新玩意. step15:使用se ...

  7. Java虚拟机栈详解

    前言 虚拟机栈也称为Java栈,每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame) 栈特点基本介绍 Java虚拟机栈属于线程私有,它的生命周期与线程相同(随线程而生,随 ...

  8. java虚拟机栈(亦篇足以,吴懈可击)

    文章目录 前言 一.虚拟机栈的概述 1.虚拟机栈出现的背景 2.虚拟机栈的概述 3.虚拟机栈中的常见异常 二.栈的存储单位 ※局部变量表 1.局部变量表概况 2. 变量槽Slot 3.局部变量和成员变 ...

  9. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

最新文章

  1. 舒工给您娓娓道来:2019-nCoV,教室布局筛查追溯系统算法解密!
  2. javascript的call()方法与apply()方法的理解
  3. Proximal Algorithms 4 Algorithms
  4. 想转行ML/AI却没有方向?这篇指南告诉你!
  5. powerbuilder+2个dw联动_千元级小众表,只知道DW就out了,这5个英国品牌一样精致百搭...
  6. ThinkPHP笔记——完全配置参考手册
  7. 2019第十届蓝桥杯C/C++ A组省赛 —— 第四题:迷宫
  8. 计算机c盘哪些东西可以清理,细说电脑c盘哪些文件可以删除
  9. Swift中文教程(二十一) 协议
  10. Go 标准库介绍五: io
  11. MathType7.0嵌入Office2019教程
  12. R语言统计—配对t检验样本量计算
  13. win7网络打印机重启后脱机的问题
  14. 有哪些简洁好看且能高效整理信息的便签软件
  15. 数据分析Power BI数据建模教程(四)——如何创建计算度量值和计算表
  16. Excel函数大全-10查找和引用函数
  17. 天水师范计算机与科学怎么样,甘肃大学分析:陇东学院和天水师范哪所师范类本科好?...
  18. 【Magicavoxel简易入门教程】(二) 第二章 · 自制一个NPC导出模型优化工具使用(附下载)
  19. 基于WiFi的网络授时时钟(带实时天气更新)设计——DIY方案分享
  20. fstab 与移动硬盘挂载方法

热门文章

  1. Qt 模块化开发之 pro 子项目开发
  2. 在QGIS 3.10中访问Geoserver中发布的服务
  3. android uevent_open_socket,android 6.0 healthd vold接收uevent
  4. 从零开始实现自己的Kalimba——Cocos Creator新手教程系列(一)使用瓦片图Tiledmap设计游戏地图
  5. OpenCV-提取图像中的颜色直方图(RGB、HSV)
  6. [BJDCTF 2nd]假猪套天下第一 个人联系分析总结
  7. 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
  8. vbox双网卡多台虚拟机及主机互ping且联网
  9. Dell服务器通电自启动
  10. 阳光动力2号太阳能飞机平安飞抵南京