目录

  • 项目介绍:
  • 项目功能:
  • 项目知识点:
  • 项目思路:
  • 测试数据及分析:
    • 1.直接走出
    • 2.需要回退,重新找路
    • 3.不通,回退直到栈为空
  • 代码:
    • Maze.java
    • Maze_Constant.java
    • MazeNode.java
    • MazeTest.java
  • 相关链接:

项目介绍:

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

项目功能:

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

项目知识点:

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

项目思路:

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

测试数据及分析:

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设计背景 1.2开发工具及环境 2.系统分析与设计 2.1设计目的 2.2功能需求 2.3系统功能代码设计 2.3.1算法说明 3.系统调试 3.1编写源程序界面 4.设计总 ...

  2. Word Maze单词迷宫C语言解法(详细注解)

    Word Maze单词迷宫C语言解法(详细注解) 题目描述 C语言代码 DFS算法 题目描述 Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.假设给定 ...

  3. word maze 单词迷宫 (java语言编写)

    Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词 if,你必须先吃掉i然后才能吃掉f.但现在你的任务可没有这么简单,你现在处于一个 ...

  4. 2015年华为实习生机试样题(记票统计,计算麻将的番数,Word Maze(单词迷宫))

    这是华为今年实习生招聘给的样题,还是特别喜欢考字符串处理问题. 记票统计 描述: 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用"A"."B" ...

  5. 华为软件类校招 2014年9月3日 熟悉机考环境 1.记票统计 2.求最大递增数 3.Word Maze(单词迷宫)

    (样题,已对外公布)记票统计 描述: 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用"A"."B"."C"." ...

  6. 华为上机题之Word Maze(单词迷宫)

    Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f. 但现在你的任务可没有这么简单,你现在处于一个 ...

  7. 20150802厦门大学华为校园提前批招聘机试体验题三:Word Maze(单词迷宫)

    题三: (样题,已对外公布)Word Maze(单词迷宫) 描述: Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉.如上图,假设给定单词if,你必须先 ...

  8. java课程设计总结迷宫_Java课程设计走迷宫详解.doc

    Java语言与面向对象技术 课程设计报告 ( 2014 -- 2015年度第 1 学期) 走迷宫 目 录 目 录2 1 概 述1 1.1 课程设计目的1 1.2 课程设计内容1 2 系统需求分析2 2 ...

  9. 穿迷宫、搭积木、现场编程 看看孩子们的机器人“大战”

    上游新闻·重庆晚报慢新闻记者 彭光瑞 文 任君 图 一只"迷途"的机器人跑进了迷宫当中,没有指引.没有帮助,只能自己四处"碰壁",再自动寻路,十几秒之后,碰得& ...

  10. C语言 迷宫问题求解(顺序栈应用示例)

    [cpp] view plaincopy //顺序栈的应用:迷宫 //作者:nuaazdh //时间:2011年12月7日 #include <stdio.h> #include < ...

最新文章

  1. mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
  2. 第一题:Big Countries
  3. 建德有没有计算机培训,建德计算机培训,建德计算机培训班,建德计算机培训完好找工作吗 - IT教育频道...
  4. emacs .emacs_使用Emacs应该做的6件事
  5. c语言 写高斯分布函数
  6. 新城建产品 DTCIM
  7. java开发业务流程图,什么是业务流程图?业务流程图如何绘制?
  8. 安川g7接线端子图_安川G7(IP)+蓝光STB板同步
  9. 大数据培训分享大数据六大核心技术
  10. 使用Sbo用户自定义业务对象
  11. 在Visual Studio中对Epicor10进行二次开发
  12. CAN总线(一)——CAN总线是什么,在哪用,怎么用?
  13. Python——等额本金计算
  14. 惠州学院计算机科学与技术录取分数线,惠州学院录取分数线2021是多少分(附历年录取分数线)...
  15. Kubesphere-多节点安装
  16. java毕业设计_短视频分享网站
  17. 第07节 C++类的组合
  18. 同或门真值表_逻辑函数表达式、真值表.ppt
  19. 餐饮业的前景与发展趋势
  20. 怎么看vray渲染进度_【3dmax疑难问题】渲染有进度条但渲染窗口不见了

热门文章

  1. spring boot + websocket 简单实现斗鱼弹幕功能
  2. SQL分组排序和排序函数(rank、dense_rank、row_number)
  3. [渝粤教育] 长安大学 液压传动 参考 资料
  4. _crol_和_cror_的使用
  5. 怎么找网页源文件位置_无法查看网页的源文件该怎么办?
  6. 北斗与GPS有哪些区别?
  7. CAD直线和平面投影
  8. STM32MP157(实验九)——SysTick定时器us延时
  9. python培训班靠谱吗-天津靠谱的python培训班
  10. 金蝶K3销售订单批量库存查询功能开发