Java迷宫代码,深度优先遍历
此次迷宫深度优先遍历寻找路径采用栈结构,每个节点都有固定的行走方向(右下左上),除非一个方向走不通,不然会一条道走到黑。
如果路径存在,打印出行走路径,否则打印出迷宫不存在有效路径。
方向常量定义:
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迷宫代码,深度优先遍历相关推荐
- java 迷宫代码_老鼠走迷宫代码 JAVA
展开全部 //老鼠走迷宫程序 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Maze1 ...
- java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...
1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...
- 连通分量 java_Java编程实现深度优先遍历与连通分量代码示例
深度优先遍历 深度优先遍历类似于一个人走迷宫: 如图所示,从起点开始选择一条边走到下一个顶点,没到一个顶点便标记此顶点已到达. 当来到一个标记过的顶点时回退到上一个顶点,再选择一条没有到达过的顶点. ...
- 用python深度优先遍历解迷宫问题
这篇文章主要给大家介绍了关于python迷宫问题深度优先遍历的相关资料,深度优先搜索算法(Depth-First-Search),是搜索算法的一种,需要的朋友可以参考下 一.迷宫介绍 用python解 ...
- 多级树的深度优先遍历与广度优先遍历(Java实现)
目录 多级树的深度优先遍历与广度优先遍历(Java实现) 节点模型 深度优先遍历 广度优先遍历 多级树的深度优先遍历与广度优先遍历(Java实现) 深度优先遍历与广度优先遍历其实是属于图算法的一种,多 ...
- Java实现深度优先遍历-DFS
Java实现深度优先遍历-DFS 实现功能:使用深度优先遍历算法DFS计算地铁指定起点站和终点站之间的所有路径 1.构造地铁站点数据结构 地铁站点数据结构包含2个属性,1个站点名,1个邻接站点列表 i ...
- 数据结构与算法(7-2)图的遍历(深度优先遍历DFS、广度优先遍历BFS)(分别用邻接矩阵和邻接表实现)
目录 深度优先遍历(DFS)和广度优先遍历(BFS)原理 1.自己的原理图 2.官方原理图 一.邻接矩阵的深度优先遍历(DFS) 1.原理图 2. 过程: 3.总代码 二.邻接表的深度优先遍历(DFS ...
- java随机生成迷宫(图的深度优先遍历)
最近经常在机房看同学在玩一个走迷宫的游戏,比较有趣,自己也用java写一个实现随机生成迷宫的算法,其实就是一个图的深度优先遍历算法.基本思想就是,迷宫中的每个点都有四面墙,然后呢, 从任意一点开始访问 ...
- java语言实现图的深度优先遍历
java语言实现图的深度优先遍历: 图的存储采用的是邻接矩阵存储的方式,对下面的无向图进行遍历 代码如下: public class Deep {int count=0;public static v ...
最新文章
- 安卓 Handler使用方法
- VTK:创建颜色系列用法实战
- PHP保留小数三种方法
- 每天一道LeetCode-----将字符串切分成若干单词,使得每个单词都在给定的字典中,求出所有的切分结果
- curl 访问不到html_嵌入式工程师入门前后端系列1:访问一个网页
- mysql 表锁——读锁和写锁
- 基于LVS对LAMP做负载均衡集群
- matlab画出周期为2的方波图形 傅立叶级数_高等数学系列R之四:傅立叶级数及变换...
- python基础语法实验要求_Python基础语法-关于条件
- Java中的HashSet和TreeSet
- 目前8岁女儿上的课程
- Top1方案源码和数据,腾讯广告受众基础属性预估
- Oracle日期函数TRUNC
- 如何用VsCode进行Debug
- ios如何解除dns被劫持_iPhone被DNS劫持,老跳广告咋办?
- 「 iOS知识小集 」2018 · 第 35 期
- 为什么选择高防DNS云解析?(二)
- 推荐系统通用用户表征预训练研究进展
- 网络图片加载缓慢问题解决方案
- android 程序根据重力感应切换程序的方向
热门文章
- Git GUI,Git Bash,Git CMD标签之间的区别
- Web开发之四:前后端开发模式探讨
- qt glsl渲染rgb
- 记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历
- java 多态_Java基础深度总结:多态
- 【算法】普里姆算法 Prim算法解决修路问题
- 【Elasticsearch】es 集群健康值 红色 red 分片 未分配
- 【Elasticsearch】es 7 Failed to parse value [analyzed] as only [true] or [false] are allowed
- 【ElasticSearch】Es 源码之 PageCacheRecycler 源码解读
- 【Spring】Springb boot 集成 Es 7.6.0