通过矩阵,找迷宫最短路径并输出路径。
初始化
- 借助队列或栈存节点位置信息,路径长度
- 设置一个路径记录数组,每一个位置上记录的是其上一步的节点位置(默认只一条最优路径)
BFS
- 从起点往四周搜索(搜索顺序决定方向优先级),不越矩阵范围
- 一个节点有效(能进入某种存储结构)满足,不是墙 && 新路
- 探索到终点,循环结束
恢复路径
- 从终点开始读路径数组
- 记录每一个结点,直到溯回起点
- 得到逆路径
import java.util.LinkedList;
import java.util.Queue;
public class GraphThe {
/*
* 第十届蓝桥杯省赛A组C语言第四题
* 最优路径+字典序最小+起点到终点
*/
//bfs找迷宫的最短路径
//优先级按照 v<>^ 1 2 3 4
//建立一个二维矩阵 储存一个数组 数组中三个元素 前两位是上一个节点的位置信息 后一位是方向信息
public String findTheShortest(int[][] graph)
{
int n = graph.length-1;
int m = graph[0].length-1;
Queue<Integer[]> q = new LinkedList<Integer[]>();//广搜节点存放队
int[][][] c = new int[n+1][m+1][3];//路径数组
c[0][0] = new int[] {-1,-1,0};
q.add(new Integer[] {0,0});
//路径探索
while(true)
{
Integer[] e = q.poll();
graph[e[0]][e[1]] = 1;
if(grosp(e, 1, 0, 1, q, graph, c))//下
break;
if(grosp(e, 0, -1, 2, q, graph, c))//左
break;
if(grosp(e, 0, 1, 3, q, graph, c))//右
break;
if(grosp(e, -1, 0, 4, q, graph, c))//上
break;
}
//路径重现
String str = "";
int i=n,j=m;
while(i>=0 && j>=0)
{
if(c[i][j][2]==1)
str='D'+str;
else if(c[i][j][2]==2)
str='L'+str;
else if(c[i][j][2]==3)
str='R'+str;
else if(c[i][j][2]==4)
str='U'+str;
i = c[i][j][0];
j = c[i][j][1];
}
return str;
}
//方向探索
private boolean grosp(Integer[] e, int i, int j, int o, Queue<Integer[]> q, int[][] graph, int[][][] c) {
int n = graph.length-1;
int m = graph[0].length-1;
if(e[0]+i<=n && e[0]+i>=0 && e[1]+j>=0 && e[1]+j<=m)
{
int x = e[0]+i;
int y = e[1]+j;
if(graph[x][y]!=1 && c[x][y][2]==0)
{
q.add(new Integer[] {x,y});
c[x][y][0] = x-i;
c[x][y][1] = y-j;
c[x][y][2] = o;
}
if(x==n && y==m)
return true;
}
return false;
}
public static void main(String[] args)
{
int[][] gra = new int[][] {{0,0,0},{0,0,0}};
GraphThe g = new GraphThe();
System.out.print(g.findTheShortest(gra));
}
}