java迷宫寻找最短路径
创始人
2024-02-12 07:25:13
0

利用广度优先遍历算法的特点,由于迷宫每次只能走一格,所以对于任意一个节点,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; ifor(int j=0; jSystem.out.printf("%4d",map[i][j]);}System.out.println();}}//广度优先遍历寻找迷宫所有点的最短路径, x,y是起始点public void bfs() {Deque 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; ifor(int j=0; jdis[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 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; ifor(int j=0; jmap[i][j] = 0;}}for(int i=0; imap[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)->

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...