打开灯泡 Switch the Lamp On
https://loj.ac/problem/2632 题目描述 给出 \(n\) 行 \(m\) 列的斜线,要求从 \((0,0)\) 走到 \((n,m)\) ,只能往四个斜方向走,若斜线方向与走的方向相同,花费为 \(0\) ,否则花费为 \(1\) . 思路 比较经典的 \(bfs\) 题,可以看做是 \(0,1\) 最短路,用双端队列解决。用双端队列是为了维护队列中的单调性,即队列中元素的 \(step\) 一定时从队首到队尾单调递增的(并不严格递增)。不过这道题有一些细节需要注意。 首先你要处理好路和点的关系,明确往哪里走需要查看的是那一条斜线。 其次一个重要的点括号中也有提到,由于 \(step\) 并不是严格单增,所以我们并不能用 \(vis\) 数组储存是否访问过,因为例如我们现在在 \((2,2)\) ,到目前花费为 \(0\) ,能以 \(1\) 的代价走到 \((3,1)\) ,用 \(vis\) 数组记录后,从 \((2,0)\) 能以总代价 \(1\) 走到 \((3,1)\) ,但由于已经访问过会忽略。所以我们可以用一个 \(cost\) 数组储存到 \((x,y)\) 的最小花费,比较是否比最小花费小即可。 代码 #include<bits/stdc++.h> using namespace std; struct aa { int