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