java迷宫寻找最短路径

article/2023/10/1 2:27:00

利用广度优先遍历算法的特点,由于迷宫每次只能走一格,所以对于任意一个节点,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)->


http://www.ngui.cc/article/show-701462.html

相关文章

Linux - 使用objcopy命令修改符号的作用域避免同名符号冲突

$ objcopy --localize-symbolSYMBOL_NAME input.o output.o $ objcopy --globalize-symbolSYMBOL_NAME input.o output.o 可以加等号&#xff0c;也可以不加等号&#xff1a; objcopy --localize-symbol SYMBOL_NAME input.o output.o objcopy --globalize-symbol SYMBOL_NA…

2022亚太杯建模B题思路 : 高速列车的优化设计 小美赛数学建模 B题思路

1 B题&#xff1a;高速列车的优化设计 2022年4月12日&#xff0c;中国高铁复兴CR450多机组成功实现单列列车速度435 km/h&#xff0c;相对速度870 km/h&#xff0c;创造了高铁多机组列车穿越明线和隧道速度的世界纪录。新一代标准动车组“复兴”是中国自主研发的具有全知识产权…

变压器励磁电感以及漏感

1 励磁电感(magnetic inductance):脉冲变压器的初级电感 仅在变压器中才出现的名词,也就是一个等效电感值,事实上这个电感是变压器的初级侧电感,作用在其上的电流不会传导到次级,它的作用是拿来对铁芯产生激磁作用,使铁芯内的铁磁分子可以用来导磁,就好比铁芯是磁中性,绕上…

敏杰100 100

全部 答对 答错 敏捷综合训练4 1. [单选] “开发人员刚刚完成了产品增量的构建&#xff0c;明天将在演示中向 Sara 展示。Sara 可能接受增量或要求对其进行更改。Sara 在该项目中最有可能扮演什么角色&#xff1f;” The developers have just finished building a product i…

Redis进阶(主从复制、Redis集群、缓存穿透、缓存击穿、缓存雪崩)

目录 1、主从复制&#xff08;读写分离&#xff09; 1.1、什么是主从复制 1.2、主从复制的作用 1.3、环境搭建 1.4、一主二仆 1.5、注意事项 1.6、反客为主 1.7、哨兵模式&#xff08;sentinel&#xff09; 2、Redis集群 2.1、什么是集群 2.2、什么是redis集群 2.3…

UE4贴图自适应屏幕大小

游戏开发中&#xff0c;不同屏幕下的分辨率不同&#xff0c;模型/物品被拉伸之后贴图也会随之拉伸。 如果需要在不同屏幕下面实现贴图真实大小不变&#xff08;以下简称为自适应&#xff09;&#xff0c;需要对UV进行缩放处理之后再取得对应贴图的颜色。 本文提供一种能够实现不…

【Unity】TimeLine系列教程——编排剧情!

前言 我们经常会看到游戏中有很多“花里胡哨”的系统&#xff0c;比如这样&#xff1a; 火影忍着疾风传 碧之轨迹S技能 这种效果感觉上像播放视频一样&#xff0c;但是却能将游戏不同的敌人加到镜头里面&#xff0c;有时候甚至根据双方关系还会有不同的反馈。如果是做视频或…

【Python百日进阶-WEB开发-冲進Flask】Day182 - Flask蓝图与模板继承

文章目录一、day02项目环境和结构搭建1.1 项目根目录创建apps包1.2 项目模板目录templates创建user子目录二、后端知识要点2.1 蓝图Blueprint基础知识2.1.1 为什么需要蓝图2.1.2 什么是蓝图2.1.3 蓝图的属性2.1.4 蓝图使用的步骤2.1.4.1 创建一个蓝图的包,例如user,并在view.py…

【软件工程导论】1.软件过程模型

软件过程模型什么是软件过程模型包括瀑布模型特点演化模型特点增量模型特点原型模型类型使用策略废弃策略追加策略螺旋模型特点什么是软件过程模型 又叫作软件开发模型、软件生存周期模型 包括 瀑布模型 每一阶段都会生成文档 特点 缺乏灵活性在交互使用时才能发现问题&…

React使用哲学

1.将设计好的UI根据单一功能原则来判定组件的范围&#xff0c;划分组件层级。 2.用 React 创建一个静态版本. 3.找出应用所需的 state 的最小表示 通过问自己以下三个问题&#xff0c;你可以逐个检查相应数据是否属于 state&#xff1a; 该数据是否是由父组件通过 props 传…