利用广度优先遍历算法的特点,由于迷宫每次只能走一格,所以对于任意一个节点,bfs第一次到达该点时一定是最短路径

直接上代码:

package com.common.utils;import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;/*** @ClassName Calculator* @Description:  java迷宫寻找最短路径* @Author: mischen* @date: 14:57 2022/11/24* @Version 1.0*/
public class Maze {private class Node{int x;int y;public Node(int x, int y) {this.x = x;this.y = y;}}private int[][] map;//起点private int startX;private int startY;//终点private int endX;private int endY;//代表上下左右四个可能走的方向private int[] dx = {1,0,-1,0};private int[] dy = {0,1,0,-1};public Maze(int[][] map, int startX, int startY, int endX, int endY) {this.map = map;this.startX = startX;this.startY = startY;this.endX = endX;this.endY = endY;}public static void print(int[][] map) {for(int i=0; i<map.length; i++) {for(int j=0; j<map[0].length; j++) {System.out.printf("%4d",map[i][j]);}System.out.println();}}//广度优先遍历寻找迷宫所有点的最短路径, x,y是起始点public void bfs() {Deque<Node> quene = new ArrayDeque<>();//存储每个点的前驱节点,方便打印最短路径的路线int[][] pre = new  int[this.map.length][this.map[0].length];//存储每个点的最短路径int[][] dis = new  int[this.map.length][this.map[0].length];for(int i=0; i<dis.length; i++) {for(int j=0; j<dis[0].length; j++) {dis[i][j] = 100;}}//将起点入队,起点的距离设为0,并标记为已访问quene.add(new Node(this.startX, this.startY));dis[this.startX][this.startY] = 0;map[this.startX][this.startY] = 2;Node temp;//广度优先遍历所有可访问的点,并记下每个点的最短路径和前驱节点while(!quene.isEmpty()) {temp = quene.poll();//尝试每个点的四个方向for(int i=0; i<4; i++) {int tx = temp.x + dx[i];int ty = temp.y + dy[i];//如果该点没有访问过,将该点入队并标记为访问过if(map[tx][ty] == 0) {//迷宫中每次只能走一步,所以距离加一dis[tx][ty] = dis[temp.x][temp.y] + 1;pre[tx][ty] = i;map[tx][ty] = 2;quene.add(new Node(tx, ty));}}}//到这里dis中存放的就是最短路径,下面时利用pre数组打印路径int a = this.endX;int b = this.endY;System.out.printf("从(%d,%d)到(%d,%d)的最短距离是:%d,路线为:\n",this.startX, this.startY, a, b, dis[a][b]);//倒序访问最短路径的路线并入栈Stack<Node> stack = new Stack<>();stack.add(new Node(a, b));while(a != this.startX || b != this.startY) {int da = dx[pre[a][b]];int db = dy[pre[a][b]];a = a - da;b = b - db;stack.add(new Node(a,b));}//出栈的顺序就是从起点到终点的路线while(!stack.isEmpty()) {Node p = stack.pop();System.out.printf("(%d,%d)->",p.x,p.y);}}public static void main(String[] args) {//创建一个迷宫并初始化int[][] map = new int[8][8];for(int i=0; i<map.length; i++) {for(int j=0; j<map[0].length; j++) {map[i][j] = 0;}}for(int i=0; i<map.length; i++) {map[i][0] = -1;map[i][7] = -1;map[0][i] = -1;map[7][i] = -1;}map[4][1] = -1;map[4][2] = -1;map[5][3] = -1;map[4][4] = -1;map[3][4] = -1;print(map);Maze maze = new Maze(map, 1, 1, 5, 2);maze.bfs();}
}

运行结果:
-1 -1 -1 -1 -1 -1 -1 -1
-1 0 0 0 0 0 0 -1
-1 0 0 0 0 0 0 -1
-1 0 0 0 -1 0 0 -1
-1 -1 -1 0 -1 0 0 -1
-1 0 0 -1 0 0 0 -1
-1 0 0 0 0 0 0 -1
-1 -1 -1 -1 -1 -1 -1 -1
从(1,1)到(5,2)的最短距离是:13,路线为:
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(6,5)->(6,4)->(6,3)->(6,2)->(5,2)->

java迷宫寻找最短路径相关推荐

  1. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  2. 用java单源最短路径问题_java 单源最短路径问题

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...

  3. java 迷宫游戏_Java小项目之迷宫游戏的实现方法

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

  4. 数据结构课程设计——项目2:校园导游咨询(图 Dijkstra算法寻找最短路径)

    数据结构课程设计--项目2:校园导游咨询(图 Dijkstra算法寻找最短路径) 一.问题描述和项目要求 1.1 问题描述 1.2 基本要求 二.问题分析 2.1 程序功能设计分析 2.2 程序实现分 ...

  5. BFS广度优先遍历寻找最短路径(超详细实现过程)

    广度优先遍历寻找最短路径 最近一直想搞A*算法,发现有部分没理解清楚.于是找到了广度优先遍历寻路算法学习了下,想看看可不可以对写A*有什么帮助.广度优先遍历寻路算法本身并不难,概括来说就是像雷达一样, ...

  6. 【算法】机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫破壁解法(适用于走迷宫.最短路径算法)-20200412 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通 ...

  7. java快速寻找一个数组的最大值或最小值, min, max,三种方法

    java 中 寻找一个数组中的最大值或最小,除了自己专门编写一个 min 或 max 函数外,还有几种方式方便使用. 1. 使用 stream 将一个数组放进 stream 里面,然后直接调用 str ...

  8. python最短路径例子_Python实现的多叉树寻找最短路径算法示例

    本文实例讲述了Python实现的多叉树寻找最短路径算法.分享给大家供大家参考,具体如下: 多叉树的最短路径: 思想: 传入start 和 end 两个 目标值 1 找到从根节点到目标节点的路径 2 从 ...

  9. 迷宫的最短路径(bfs)

    宽度优先搜索(BFS,Breadth-First Search)也是搜索的手段之一,与深度优先搜索类似,从某个状态出发搜索所有可以到达的状态. 与深度优先搜索的不同之处在于搜索的顺序,宽度优先搜索总是 ...

最新文章

  1. 收藏 | 精选11篇AI领域论文(附代码、数据集链接)
  2. {ldelim},{rdelim} - smarty 内建函数
  3. 6.3 优化-机器学习笔记-斯坦福吴恩达教授
  4. cocos2d, Box2D
  5. 网络编程知识预备(5) ——libcurl库简介及其编程访问百度首页
  6. foreach lambda写法_Java8新特性之forEach+Lambda 表达式遍历Map和List
  7. 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)
  8. Web开发之三:前后端开发任务量分析与比较
  9. DataView筛选出最新的十条数据的方法总结;
  10. 谁才是世界上最好的 CI/CD 工具?
  11. 安卓9.0官方系统升级包_想升级鸿蒙系统都来看看!华为新系统升级名单曝光:有你手机吗?...
  12. Mac 修改hosts文件
  13. 测试基础-系统测试包括哪些内容
  14. 父进程退出,保证子进程交由init。
  15. 盘点国内优秀的机器人公司
  16. Nature计算社会科学特刊:如何对21世纪人类社会进行有意义的度量?
  17. SSH Error: Permission denied (publickey)
  18. 逻辑回归(吴恩达机器学习笔记)
  19. idea的Annotate,可以在某个文件内部查看哪一行代码是谁提交的
  20. 龍行天下 GHOST XP SP3 VIP会员特供版

热门文章

  1. JavaEE15_Ajax和JSON
  2. vr虚拟旅游:躺在自家的沙发上“来一场说走就走”的旅行
  3. 毕业设计 嵌入式 太空游戏机设计与实现
  4. ctrl c复制浏览器html,桌面神器!按两下Ctrl+C,网页、文件一键收藏
  5. HBase基本数据操作详解
  6. 思科路由器OSPF动态路由配置
  7. openfire运行ant命令控制台中文乱码问题
  8. 荣耀v8 android os,华为荣耀V8的手机系统是什么
  9. Mac使用charles抓包(外加小米5s抓包配置)
  10. 海华AW_CM276NF模块驱动调试