1448:【例题1】电路维修
样例
样例输入 样例输出
3 5 1
\\/\\
\\///
/\\\\
题解
我们可以把电路板上的每个格点(横线与竖线的交叉点)看作无向图中的结点。
若两个结点x和y是某个小方格的两个对角,则在x与y之间连边。若该方格中的标准件(对角线)与x到y的线段重合,则边权为0;若垂直相交,则边权为1(说明需要旋转1次才能连通)。然后,我们在这个无向图中求出从左上角到右下角的最短距离,就得到了结果。
这是一个边权要么是0,要么是1的无向图。在这样的图上,我们可以通过双端队列广度搜索计算。
分支边权为1,从队尾入
分支边权为0,从队首入
保证两段性和单调性
因为每个节点只需要访问一次,所以算法的时间复杂度为O(R×C)
注释:
1.
make_pair的用法
无需写出型别, 就可以生成一个pair对象
例: make_pair(42,‘%’);
而不必费力写成: pair<int, char>(42,‘%’)
2. if((r+c)%2)
那么无解
画个图理解一下就好了,毕竟你是要走对角线
代码
#include<iostream>
#inc