此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑。

如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径。

方向常量定义:

public interface Constant {// 右方向int RIGHT = 0;// 下方向int DOWN = 1;// 左方向int LEFT = 2;// 上方向int UP = 3;
}

所用到的栈定义(jdk自带的栈或集合也可以实现此功能)

/*** 描述:实现迷宫路径搜索需要的链式栈结构** @Author shilei* @Date 2019/5/18*/
public class Stack<T> {// top指向头节点,头节点的后面就是栈顶节点private Entry<T> top;public Stack() {this.top =new Entry<>(null,null);}/*** 入栈操作* @param val*/public void push(T val){Entry<T> newEntry=new Entry<>(val,this.top.next);this.top.next=newEntry;}/*** 出栈操作* @return*/public T pop(){Entry<T> entry=this.top.next;this.top.next=this.top.next.next;return entry.data;}/*** 查看栈顶元素* @return*/public T peek(){if(isEmpty())return null;return this.top.next.data;}/*** 判断栈空* @return*/public boolean isEmpty(){return this.top.next==null;}/*** 节点类型定义* @param <T>*/static class Entry<T>{T data;Entry<T> next;public Entry(T data, Entry<T> next) {this.data = data;this.next = next;}}
}

迷宫节点类型定义

    /*** 描述: 定义迷宫节点类型*/private static class MazeNode {// 节点的值int val;// 节点的x和y坐标int x;int y;// 节点四个方向的行走状态,true表示可以走,false表示不能走boolean[] state;/*** 迷宫路径初始化* @param data* @param i* @param j*/public MazeNode(int data, int i, int j){this.state = new boolean[4];this.val = data;this.x = i;this.y = j;}}

迷宫类型定义

/*** 描述: 迷宫的类型定义** @Author shilei* @Date 2019/5/18*/
public class Maze {// 迷宫所有的路径存储在二维数组当中private MazeNode[][] maze;// 存储迷宫路径节点的栈 深度优先private Stack<MazeNode> stack;// 迷宫的行数private int row;// 迷宫的列数private int col;/*** 迷宫初始化* @param row* @param col*/public Maze(int row, int col) {this.row = row;this.col = col;this.maze = new MazeNode[row][col];this.stack = new Stack<>();}/*** 初始化指定位置的迷宫节点* @param data* @param i* @param j*/public void initMazeNode(int data, int i, int j) {this.maze[i][j] = new MazeNode(data, i, j);}/*** 修改迷宫所有节点四个方向的行走状态信息*/public void initMazeNodePathState() {for (int i=0;i<row;i++){for (int j=0;j<col;j++){if(j+1<col&&maze[i][j+1].val==0){maze[i][j].state[Constant.RIGHT]=true;}if(i+1<row&&maze[i+1][j].val==0){maze[i][j].state[Constant.DOWN]=true;}if(j>0&&maze[i][j-1].val==0){maze[i][j].state[Constant.LEFT]=true;}if(i>0&&maze[i-1][j].val==0){maze[i][j].state[Constant.UP]=true;}}}}/*** 寻找迷宫路径*/public void findMazePath() {
// 深度优先if (maze[0][0].val != 0) {return;}stack.push(maze[0][0]);while (!stack.isEmpty()) {MazeNode top = stack.peek();//找到出口if (top.x == row - 1 && top.y == col - 1) {break;}if (top.state[Constant.RIGHT]) {top.state[Constant.RIGHT] = false;stack.push(maze[top.x][top.y + 1]);this.stack.peek().state[Constant.LEFT] = false;continue;}if (top.state[Constant.DOWN]) {top.state[Constant.DOWN] = false;stack.push(maze[top.x + 1][top.y]);this.stack.peek().state[Constant.UP] = false;continue;}if (top.state[Constant.LEFT]) {top.state[Constant.LEFT] = false;stack.push(maze[top.x][top.y - 1]);this.stack.peek().state[Constant.RIGHT] = false;continue;}if (top.state[Constant.UP]) {top.state[Constant.UP] = false;stack.push(maze[top.x - 1][top.y]);this.stack.peek().state[Constant.DOWN] = false;continue;}stack.pop();}
    }/*** 打印迷宫路径搜索的结果*/public void showMazePath(){if(this.stack.isEmpty()){System.out.println("迷宫出不去咯");}else {while (!stack.isEmpty()){MazeNode top=stack.pop();maze[top.x][top.y].val='*';}for (int i = 0; i <row ; i++) {for (int j = 0; j <col ; j++) {if(maze[i][j].val=='*'){System.out.print("*"+" ");continue;}System.out.print(maze[i][j].val+" ");}System.out.println();}}
    }/*** 描述: 定义迷宫节点类型*/private static class MazeNode {// 节点的值int val;// 节点的x和y坐标int x;int y;// 节点四个方向的行走状态,true表示可以走,false表示不能走boolean[] state;/*** 迷宫路径初始化* @param data* @param i* @param j*/public MazeNode(int data, int i, int j){this.state = new boolean[4];this.val = data;this.x = i;this.y = j;}}
}

测试类

public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.print("请输入迷宫的行列数:");int row, col, data;row = in.nextInt();col = in.nextInt();Maze maze = new Maze(row, col);System.out.println("请输入迷宫路径");for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {data = in.nextInt();maze.initMazeNode(data, i, j);}}// 修改迷宫所有节点四个方向的行走状态信息
        maze.initMazeNodePathState();// 寻找迷宫路径
        maze.findMazePath();// 打印迷宫路径搜索的结果
        maze.showMazePath();}
}

结果:

请输入迷宫的行列数:4 5
请输入迷宫路径0  1  0  0 00  0  0  1 01  0  1  1 00  0  0  0 0* 1 * * *
* * * 1 *
1 0 1 1 *
0 0 0 0 * 

缺点:深度优先无法求出迷宫最短路径,下一篇广度优先遍历可以求出最短路径。

转载于:https://www.cnblogs.com/jiezai/p/11067842.html

Java迷宫代码,深度优先遍历相关推荐

  1. java 迷宫代码_老鼠走迷宫代码 JAVA

    展开全部 //老鼠走迷宫程序 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Maze1 ...

  2. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  3. 连通分量 java_Java编程实现深度优先遍历与连通分量代码示例

    深度优先遍历 深度优先遍历类似于一个人走迷宫: 如图所示,从起点开始选择一条边走到下一个顶点,没到一个顶点便标记此顶点已到达. 当来到一个标记过的顶点时回退到上一个顶点,再选择一条没有到达过的顶点. ...

  4. 用python深度优先遍历解迷宫问题

    这篇文章主要给大家介绍了关于python迷宫问题深度优先遍历的相关资料,深度优先搜索算法(Depth-First-Search),是搜索算法的一种,需要的朋友可以参考下 一.迷宫介绍 用python解 ...

  5. 多级树的深度优先遍历与广度优先遍历(Java实现)

    目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...

  6. Java实现深度优先遍历-DFS

    Java实现深度优先遍历-DFS 实现功能:使用深度优先遍历算法DFS计算地铁指定起点站和终点站之间的所有路径 1.构造地铁站点数据结构 地铁站点数据结构包含2个属性,1个站点名,1个邻接站点列表 i ...

  7. 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)

    目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...

  8. java随机生成迷宫(图的深度优先遍历)

    最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢, 从任意一点开始访问 ...

  9. java语言实现图的深度优先遍历

    java语言实现图的深度优先遍历: 图的存储采用的是邻接矩阵存储的方式,对下面的无向图进行遍历 代码如下: public class Deep {int count=0;public static v ...

最新文章

  1. 安卓 Handler使用方法
  2. VTK:创建颜色系列用法实战
  3. PHP保留小数三种方法
  4. 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
  5. curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页
  6. mysql 表锁——读锁和写锁
  7. 基于LVS对LAMP做负载均衡集群
  8. matlab画出周期为2的方波图形 傅立叶级数_高等数学系列R之四:傅立叶级数及变换...
  9. python基础语法实验要求_Python基础语法-关于条件
  10. Java中的HashSet和TreeSet
  11. 目前8岁女儿上的课程
  12. Top1方案源码和数据,腾讯广告受众基础属性预估
  13. Oracle日期函数TRUNC
  14. 如何用VsCode进行Debug
  15. ios如何解除dns被劫持_iPhone被DNS劫持,老跳广告咋办?
  16. 「 iOS知识小集 」2018 · 第 35 期
  17. 为什么选择高防DNS云解析?(二)
  18. 推荐系统通用用户表征预训练研究进展
  19. 网络图片加载缓慢问题解决方案
  20. android 程序根据重力感应切换程序的方向

热门文章

  1. Git GUI,Git Bash,Git CMD标签之间的区别
  2. Web开发之四:前后端开发模式探讨
  3. qt glsl渲染rgb
  4. 记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历
  5. java 多态_Java基础深度总结:多态
  6. 【算法】普里姆算法 Prim算法解决修路问题
  7. 【Elasticsearch】es 集群健康值 红色 red 分片 未分配
  8. 【Elasticsearch】es 7 Failed to parse value [analyzed] as only [true] or [false] are allowed
  9. 【ElasticSearch】Es 源码之 PageCacheRecycler 源码解读
  10. 【Spring】Springb boot 集成 Es 7.6.0