迷宫(Maze)项目实现
目录
- 项目介绍:
- 项目功能:
- 项目知识点:
- 项目思路:
- 测试数据及分析:
- 1.直接走出
- 2.需要回退,重新找路
- 3.不通,回退直到栈为空
- 代码:
- Maze.java
- Maze_Constant.java
- MazeNode.java
- MazeTest.java
- 相关链接:
项目介绍:
一个网格迷宫由n行m列的单元格组成,每个大院个要么是空地(用0表示),要么是障碍物(用1表示)。你的任务是找一条从起点到终点的移动序列,其中只能上下左右移动到相邻单元格。任何时候都不能在有障碍物的单元格中,也不能走到迷宫之外。起点为左上角和终点右下角。
项目功能:
- 寻找一条从左上角迷宫入口到右下角迷宫出口的一条有效路径。
- 0代表可走,1代表不能行走,8代表行走的路径。
- 找到请输出最终的迷宫和路径信息,找不到请输出不存在有效路径。
项目知识点:
采用Java面向对象思想,二维数组以及非递归栈进行实现
项目思路:
- 定义一个迷宫节点类型(MazeNode)的二维数组
- 初始化每个格子中的value值。给二维数组每个格子存放对象。对象的value值只能为0(当前格子可以走)或者1(当前格子不能走)
- 初始化每个格子四个方向(东南西北)是否是可走状态。根据当前节点周围四个方向格子中的value值,判断当前节点的东南西北四个方向是否可走(0是可走,1不可走)。
- 开始走迷宫。采用栈操作,记录行走的路径,将左上角元素入栈,判断当前栈顶元素的哪个方向可走,将其中一个可走方向进行入栈操作,直到右下角元素停止。栈中保存走过的路径。
注意:如果遇到走入死胡同问题,此时需要将是栈顶元素并且栈顶元素的四个方向都不能行走,此时将其出栈,选择新方向再次入栈,直到右下角元素停止。
测试数据及分析:
1.直接走出
2.需要回退,重新找路
3.不通,回退直到栈为空
代码:
Maze.java
import java.util.Scanner;
import java.util.Stack;public class Maze {private MazeNode[][] mazeNodes;//节点数组private int row;//数组的行个数private int column;//列private Stack<MazeNode> stack;public Maze( int row, int column) {this.row = row;this.column = column;mazeNodes = new MazeNode[row][column];stack=new Stack<MazeNode>();}//初始化value值public void initValue() {System.out.println("请输入迷宫路径:(0表示可走,1表示不可走)");Scanner sc=new Scanner(System.in);for(int i=0;i<row;i++)for(int j=0;j<column;j++){mazeNodes[i][j]=new MazeNode(sc.nextInt(),i,j);}}//初始化每个结点的行走状态//--------->j |// 上北 |//左西 右东 \|/// 下南 i private void initWayState() {for(int i=0;i<row;i++)for(int j=0;j<column;j++){//为1像墙不可达,故不用 判断墙的四周//四周都要判断,不要用else ifif(mazeNodes[i][j].getValue() == 0) {//东 为0可走就置able)if(j+1<column && mazeNodes[i][j+1].getValue() == 0) {mazeNodes[i][j].setWayState(Maze_Constant.WAY_EAST,Maze_Constant.WAY_ABLE);}//南if(i+1<row && mazeNodes[i+1][j].getValue() == 0) {mazeNodes[i][j].setWayState(Maze_Constant.WAY_SOUTH,Maze_Constant.WAY_ABLE);}//西if(j-1>=0 && mazeNodes[i][j-1].getValue() == 0) {mazeNodes[i][j].setWayState(Maze_Constant.WAY_WEST,Maze_Constant.WAY_ABLE);}//北if(i-1>=0 && mazeNodes[i-1][j].getValue() == 0) {mazeNodes[i][j].setWayState(Maze_Constant.WAY_NORTH,Maze_Constant.WAY_ABLE);}} }}//从左上角找右下角的出路//找到一条就行public void goMaze() {initValue();initWayState();if(mazeNodes[0][0].getValue()!=0) {System.out.println("没有路径");return;}//用栈保存行走路线信息stack.push(mazeNodes[0][0]);while(!stack.isEmpty()) {MazeNode top=stack.peek();//获取栈顶端的元素//到右下角了if(top.getxPos()==row-1 && top.getyPos()==column-1) {break;}//获取栈顶元素位置int xPos=top.getxPos();int yPos=top.getyPos();//不用看越界,已经初始化过各方向状态了//避免成环//注意每次while循环 只走一步路,所以搭配else ifif(top.getWayState(Maze_Constant.WAY_EAST)) {//向东走stack.push(mazeNodes[xPos][yPos+1]);//将当前结点(x,y)的走过方向(东)封掉mazeNodes[xPos][yPos].setWayState(Maze_Constant.WAY_EAST, Maze_Constant.WAY_DISABLE);//将东边结点(x,y+1)的回路,西边方向封掉mazeNodes[xPos][yPos+1].setWayState(Maze_Constant.WAY_WEST, Maze_Constant.WAY_DISABLE); }else if(top.getWayState(Maze_Constant.WAY_SOUTH)) {//南stack.push(mazeNodes[xPos+1][yPos]);mazeNodes[xPos][yPos].setWayState(Maze_Constant.WAY_SOUTH, Maze_Constant.WAY_DISABLE);mazeNodes[xPos+1][yPos].setWayState(Maze_Constant.WAY_NORTH, Maze_Constant.WAY_DISABLE); }else if(top.getWayState(Maze_Constant.WAY_WEST)) {//西stack.push(mazeNodes[xPos][yPos-1]);mazeNodes[xPos][yPos].setWayState(Maze_Constant.WAY_WEST, Maze_Constant.WAY_DISABLE);mazeNodes[xPos][yPos-1].setWayState(Maze_Constant.WAY_EAST, Maze_Constant.WAY_DISABLE);}else if(top.getWayState(Maze_Constant.WAY_NORTH)) {//北stack.push(mazeNodes[xPos-1][yPos]);mazeNodes[xPos][yPos].setWayState(Maze_Constant.WAY_NORTH, Maze_Constant.WAY_DISABLE);mazeNodes[xPos-1][yPos].setWayState(Maze_Constant.WAY_SOUTH, Maze_Constant.WAY_DISABLE);}else if(!top.getWayState(Maze_Constant.WAY_EAST)&&!top.getWayState(Maze_Constant.WAY_WEST)&&!top.getWayState(Maze_Constant.WAY_NORTH)&&!top.getWayState(Maze_Constant.WAY_SOUTH)) {//说明进入死胡同结点(四周都不能走),从栈中删除栈顶元素,重找stack.pop();//删除栈顶元素}}show();}//找到路径后,需要将栈中的元素值改为可识别的private void show() {// TODO Auto-generated method stubif(stack.isEmpty()) {System.out.println("没有迷宫路径");return;//退出}while(!stack.isEmpty()) {MazeNode top=stack.peek();top.setValue(8);stack.pop();}System.out.println("路径已找到,如下(2代表行走 的路径):");for(int i=0;i<row;i++) {for(int j=0;j<column;j++){System.out.print(mazeNodes[i][j].getValue()+" ");}System.out.println();}}
}
Maze_Constant.java
public class Maze_Constant {public static final int WAYSIZE=4;public static final int WAY_EAST=0;//东南西北public static final int WAY_SOUTH=1 ;public static final int WAY_WEST=2 ;public static final int WAY_NORTH=3 ;public static final boolean WAY_ABLE=true ;public static final boolean WAY_DISABLE=false ;}
MazeNode.java
public class MazeNode {private int value;//0或1//当前对象在二维数组中的位置private int xPos;//行private int yPos;//列private boolean[] WayState;//4个元素代表4个方向public MazeNode(int value, int xPos, int yPos) {WayState =new boolean[Maze_Constant.WAYSIZE];this.value = value;this.xPos = xPos;this.yPos = yPos;}public int getValue() {// TODO Auto-generated method stubreturn value;}public void setWayState(int direction, boolean isAble) {// TODO Auto-generated method stubthis.WayState[direction]=isAble; }public int getxPos() {return xPos;}public int getyPos() {return yPos;}public boolean getWayState(int direction) {// TODO Auto-generated method stubreturn WayState[direction];}public void setValue(int i) {// TODO Auto-generated method stubvalue=i;}}
MazeTest.java
import java.util.Scanner;
import javax.xml.soap.SAAJResult;public class MazeTest {public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("请输入行列数");Scanner sc=new Scanner(System.in);int row =sc.nextInt();int column=sc.nextInt();Maze maze=new Maze(row,column);maze.goMaze();}}
相关链接:
Puzzle项目实现设计
迷宫(Maze)项目实现相关推荐
- 软件技术实习项目:实验三、迷宫游戏设计
目录 1.系统简介 1.1设计背景 1.2开发工具及环境 2.系统分析与设计 2.1设计目的 2.2功能需求 2.3系统功能代码设计 2.3.1算法说明 3.系统调试 3.1编写源程序界面 4.设计总 ...
- Word Maze单词迷宫C语言解法(详细注解)
Word Maze单词迷宫C语言解法(详细注解) 题目描述 C语言代码 DFS算法 题目描述 Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.假设给定 ...
- word maze 单词迷宫 (java语言编写)
Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词 if,你必须先吃掉i然后才能吃掉f.但现在你的任务可没有这么简单,你现在处于一个 ...
- 2015年华为实习生机试样题(记票统计,计算麻将的番数,Word Maze(单词迷宫))
这是华为今年实习生招聘给的样题,还是特别喜欢考字符串处理问题. 记票统计 描述: 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用"A"."B" ...
- 华为软件类校招 2014年9月3日 熟悉机考环境 1.记票统计 2.求最大递增数 3.Word Maze(单词迷宫)
(样题,已对外公布)记票统计 描述: 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用"A"."B"."C"." ...
- 华为上机题之Word Maze(单词迷宫)
Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你现在处于一个 ...
- 20150802厦门大学华为校园提前批招聘机试体验题三:Word Maze(单词迷宫)
题三: (样题,已对外公布)Word Maze(单词迷宫) 描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先 ...
- java课程设计总结迷宫_Java课程设计走迷宫详解.doc
Java语言与面向对象技术 课程设计报告 ( 2014 -- 2015年度第 1 学期) 走迷宫 目 录 目 录2 1 概 述1 1.1 课程设计目的1 1.2 课程设计内容1 2 系统需求分析2 2 ...
- 穿迷宫、搭积木、现场编程 看看孩子们的机器人“大战”
上游新闻·重庆晚报慢新闻记者 彭光瑞 文 任君 图 一只"迷途"的机器人跑进了迷宫当中,没有指引.没有帮助,只能自己四处"碰壁",再自动寻路,十几秒之后,碰得& ...
- C语言 迷宫问题求解(顺序栈应用示例)
[cpp] view plaincopy //顺序栈的应用:迷宫 //作者:nuaazdh //时间:2011年12月7日 #include <stdio.h> #include < ...
最新文章
- mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
- 第一题:Big Countries
- 建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...
- emacs .emacs_使用Emacs应该做的6件事
- c语言 写高斯分布函数
- 新城建产品 DTCIM
- java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
- 安川g7接线端子图_安川G7(IP)+蓝光STB板同步
- 大数据培训分享大数据六大核心技术
- 使用Sbo用户自定义业务对象
- 在Visual Studio中对Epicor10进行二次开发
- CAN总线(一)——CAN总线是什么,在哪用,怎么用?
- Python——等额本金计算
- 惠州学院计算机科学与技术录取分数线,惠州学院录取分数线2021是多少分(附历年录取分数线)...
- Kubesphere-多节点安装
- java毕业设计_短视频分享网站
- 第07节 C++类的组合
- 同或门真值表_逻辑函数表达式、真值表.ppt
- 餐饮业的前景与发展趋势
- 怎么看vray渲染进度_【3dmax疑难问题】渲染有进度条但渲染窗口不见了
热门文章
- spring boot + websocket 简单实现斗鱼弹幕功能
- SQL分组排序和排序函数(rank、dense_rank、row_number)
- [渝粤教育] 长安大学 液压传动 参考 资料
- _crol_和_cror_的使用
- 怎么找网页源文件位置_无法查看网页的源文件该怎么办?
- 北斗与GPS有哪些区别?
- CAD直线和平面投影
- STM32MP157(实验九)——SysTick定时器us延时
- python培训班靠谱吗-天津靠谱的python培训班
- 金蝶K3销售订单批量库存查询功能开发