题目:https://www.acwing.com/problem/content/177/
这道题做法挺多的,洛谷上有好多,但是都需要将该迷宫转换为一张图,即对于一条边,其对角线的点相互到达需要几次旋转,若该边为'\',则左上角到右下角可以不用旋转边直接到达,而左下角到右上角则需要一次旋转,故可将该两点间边权置为1,将图建立起来。
接下来可以有两种做法,堆优化最短路跑,广搜。
这里说一下广搜:
对于普通的广搜来说,其每一次扩展一层的花费都是相同的,即这一层转移到下一层的花费一定为1,而该题中每一层间的转移的花费是不一定相同的,因为我们允许某一点到另一点花费为0,转移代价不同,故无法使用普通的队列。
这里需要用到双端队列,将扩展花费为1的从队尾入队,花费为0的从队头入队,这样每次从队头取出一个元素既满足了扩展层次单调性(非严格递增),也满足了两段性(从1或从0而来选取最优)。
既然使用了双端队列,那么就不能像普通的bfs那样去标记状态了,看图:

如图第一步先将1入队扩展出了四个小步都入队,像普通的bfs的话此时1,2,3,4,5都应该被标记了,那么接下来3,4分别出队,3先出来,那么先到6,花费为1,6被标记,那么4就不会再走6了,从1->6最终花费为1,答案显然是错的,因为我们可以从1->4->6,花费为0。
因此每次标记时只在扩展状态初进行标记,即第一步只标记了1,后序同理。
#include&l
迷宫求解:电路维修与双端队列应用

该博客介绍了如何解决一道电路维修问题,涉及将迷宫转化为图,利用堆优化最短路或广搜算法。文章重点讨论了在广搜中使用双端队列的原因和细节,解释了为什么不能用普通队列,并通过例子说明了错误的标记状态方法,强调在扩展状态初期进行标记的重要性。
最低0.47元/天 解锁文章
646





