1.算法总括
最短路径问题:其实是隶属于我们的图论里面的这个部分的内容;
我们这个文章是使用的bfs方法找到这个最短的路径的,但是这个有一个前提就是这个边权是1,也就是这个图上面的每一条边对应的这个权重的数值是一样的,这个时候才满足我们的这个方法的使用条件;
bfs的话就是广度优先遍历,因此这个实际上上市我我们之前的那个解决洪水灌溉的这个思路基本上就是一致的,就是在一些地方需要处理一下;
首先需我们定义这个哈希表和队列,哈希表统计的是这个里面的对应位置是不是已经被遍历过了,队列的话就是对于这个遍历的结果进行存储的数据结构,其中这个队列里面的元素只有两个可能:入队或者是出队;
2.题目概述
下面的这个题目比较复杂,我们直接去看这个题目下面给出来的这个案例进行解释吧:
这个输入里面有maze和entrance其中这个entrance表示的就是这个人物当前所在的位置,我们需要做的就是找到距离这个位置最近的一个出口,这个就是最短路径问题,因为这个里面的每一步都是1个步长,所以这个题目是符合我们使用bfs这个方法的;
+表示的就是这个位置是墙壁,点表示的就是这个位置可以走,就是这个意思,也就是说图上面画出来的这个红色的区域都是无法走的;
上面的这个示例一里面是三个出口,只要是这个贴边的都是我们的出口,如果这个作为最开始的位置就在边缘的话,这个时候就没有生效,也就是说,不可以是0步长;
就是如果人物在下面的这个圆形的位置,这个时候你不可以说直接就出来了,这个时候有效的出口只有两个,他所在的那个位置就不是一个出口,只能选择另外的两个;
3.思路分析
还是使用的这个bfs的方法,dx,dy表示的就是我们的这个遍历时候的上下左右,之前的那个洪水灌溉的题目也是使用的这个方法,不清楚的话,大家可以回去看一下这个思路;
接下来就是入队出队,一般都是取出来这个队头的元素,和这个元素相关联的元素添加到我们的队列里面去,我们需要定义这个m,n保证这个对应位置的坐标是不可越界的;
4.代码分析
1)定义队列和vis,vis表示的就是我们的这个位置有没有被遍历过,遍历过就是true,没有的话就是false,这个我们后面会使用到;
2)q.add就是把这个题目给定的这个位置的横纵坐标添加到我们的这个队列里面去;
3)step负责统计这个过程中的节点的数量,这个数值就是我们最后需要返回的这个最短的路径;
4)poll出队列之后,这个时候取出来他的横纵坐标,找到这个对应的上下左右位置,通过第22行的这个判断的条件,如果没有越界,并且符合这个出口的定义,我们就直接返回这个step,如果不符合,就把这个节点添加到我们的这个队列里面去,并且这个时候这个位置的节点已经遍历过了,所以这个vis对应的布尔值就是true,需要进行更新;
5)循环结束的时候,正常情况下就return了(23行的),如果可以走到这个30行这个就说明我们的这个里面没有符合条件的;
;
[外链图片转存中…(img-K7XbR6NP-1743760321729)]