迷宫的最短路径和路径记录(第十届蓝桥杯省赛A组C语言第四题)

通过矩阵,找迷宫最短路径并输出路径。

初始化

  1. 借助队列或栈存节点位置信息,路径长度
  2. 设置一个路径记录数组,每一个位置上记录的是其上一步的节点位置(默认只一条最优路径)

BFS

  1. 从起点往四周搜索(搜索顺序决定方向优先级),不越矩阵范围
  2. 一个节点有效(能进入某种存储结构)满足,不是墙 && 新路
  3. 探索到终点,循环结束

恢复路径

  1. 从终点开始读路径数组
  2. 记录每一个结点,直到溯回起点
  3. 得到逆路径
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));
			}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值