【搜索 ex-BFS】bzoj2346: [Baltic 2011]Lamp
关于图中边权非零即一的宽度优先搜索
Description
译自 BalticOI 2011 Day1 T3「Switch the Lamp On」
有一种正方形的电路元件,在它的两组相对顶点中,有一组会用导线连接起来,另一组则不会。
有 N×MN\times MN×M 个这样的元件,你想将其排列成 NNN 行 MMM 列放在电路板上。电路板的左上角连接电源,右下角连接灯泡。
试求:至少要旋转多少个正方形元件才能让电源与灯泡连通,若无解则输出 NO SOLUTION。
题目分析
记得之前谁的讲课里提到过这种“ex-BFS”?
只需要在队列拓展的时候稍作更改:边权为一时在队尾插入;边权为零在队头插入。正确性可以由反证法得到。
#include<bits/stdc++.h> struct point
{
int x,y;
point(int a=, int b=):x(a), y(b) {}
};
int n,m,dis[][];
char str[][];
std::deque<point> q; bool legal(int x, int y)
{
return x>=&&y>=&&x<=n&&y<=m;
}
bool check(int x, int y)
{
return str[x][y]=='\\';
}
void update(int x, int y, int v)
{
if (dis[x][y] > v){
dis[x][y] = v;
if (q.empty()||v > dis[q.front().x][q.front().y])
q.push_back(point(x, y));
else q.push_front(point(x, y));
}
}
int main()
{
memset(dis, 0x3f3f3f3f, sizeof dis);
scanf("%d%d",&n,&m);
if ((n+m)%){
puts("NO SOLUTION");
return ;
}
for (int i=; i<=n; i++) scanf("%s",str[i]+);
dis[][] = , q.push_front(point(, ));
while (q.size())
{
point tt = q.front();
q.pop_front();
if (legal(tt.x+, tt.y+)){
if (check(tt.x+, tt.y+))
update(tt.x+, tt.y+, dis[tt.x][tt.y]);
else update(tt.x+, tt.y+, dis[tt.x][tt.y]+);
}
if (legal(tt.x+, tt.y-)){
if (check(tt.x+, tt.y))
update(tt.x+, tt.y-, dis[tt.x][tt.y]+);
else update(tt.x+, tt.y-, dis[tt.x][tt.y]);
}
if (legal(tt.x-, tt.y+)){
if (check(tt.x, tt.y+))
update(tt.x-, tt.y+, dis[tt.x][tt.y]+);
else update(tt.x-, tt.y+, dis[tt.x][tt.y]);
}
if (legal(tt.x-, tt.y-)){
if (check(tt.x, tt.y))
update(tt.x-, tt.y-, dis[tt.x][tt.y]);
else update(tt.x-, tt.y-, dis[tt.x][tt.y]+);
}
}
printf("%d\n",dis[n][m]);
return ;
}
END
【搜索 ex-BFS】bzoj2346: [Baltic 2011]Lamp的更多相关文章
- bzoj2346[Baltic 2011]Lamp
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- BZOJ2346:[Baltic 2011]Lamp(最短路)
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- Bzoj 2346: [Baltic 2011]Lamp dijkstra,堆
2346: [Baltic 2011]Lamp Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 428 Solved: 179[Submit][Sta ...
- bzoj2346 & loj2632 [Baltic 2011]Lamp 最短路
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2346 https://loj.ac/problem/2632 题解 普及组难度的题都要想十几分 ...
- [Baltic 2011]Lamp BZOJ2346
分析: 建图最短路,比较裸. 我们可以考虑,如果是‘\’那么,左上连右下边权为0,左下连右上边权为1,反之亦然. 卡裸spfa,加点优化能过,我就直接改成的堆优化Dijkstra 附上代码: #inc ...
- 【bzoj2346】[Baltic 2011]Lamp 堆优化Dijkstra
题目描述 2255是一个傻X,他连自己家灯不亮了都不知道.某天TZ大神路过他家,发现了这一情况,于是TZ开始行侠仗义了.TZ发现是电路板的问题,他打开了电路板,发现线路根本没有连上!!于是他强大的脑力 ...
- 【刷题】BZOJ 2346 [Baltic 2011]Lamp
Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ...
- BZOJ 2346: [Baltic 2011]Lamp Dijkstra
不难发现如果一个边的方向改变,就一定不会改回来(这样肯定不是最短路). 所以就直接建双向边,边权为 $0$ 代表不改变,边权为 $1$ 代表改变,跑一个最短路即可. #include <bits ...
- BZOJ2348: [Baltic 2011]Plagiarism
2348: [Baltic 2011]Plagiarism Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 304 Solved: 141[Submit ...
随机推荐
- c++的substr()函数
substr()函数注意:string str =“Hello”: substr(0,4)=“Hell”,0是起始位置,4是要复制的长度,strlen函数输出的是除了结束符"\0" ...
- plt
设定X,Y轴的长度以及刻度的方法. import numpy as np import matplotlib.pyplot as plt data = np.arange(0,1.1,0.01) pl ...
- Execution failed for task ':app:installDebug'.
解决方案:重新起服务(react-native start),重新起项目(react-native run-android)
- nodejs 学习(4) express+mongoose
一.关于安装和启动: 1.设置环境变量:D:\Program Files\MongoDB\bin 2.启动时需要cd到bin 目录,然后 mongod --dbpath "D:\mongdb ...
- VMware下OSSIM 4.1.0的下载、安装和初步使用(图文详解)
不多说,直接上干货! 为什么,我写了一篇OSSIM 5.2.0的,还要再来写OSSIM 4.1.0呢,是因为,OSSIM 5.2.0所需内存较大,8G甚至16G,但是,肯定性能和里面集成组件越高级.也 ...
- Notepad++ 安装 Zen Coding / Emmet 插件
Zen Coding 插件 ============== 下载: Zen.Coding-Notepad++.v0.7.zip ==Installation== 1. Copy contents of ...
- android开发学习 ------- 【转】 android中的线程池
线程很常见 , https://blog.csdn.net/seu_calvin/article/details/52415337 参考,保证能看懂.
- 解决“程序包管理器控制台”输入命令找不到Nuget包问题
问题: 问题原因: Nuget源的地址上不去 解决办法: 1.将Nuget源更新为可以国内使用的官方Nuget源. 1)打开VS2013:工具-->Nuget程序包管理器-->程序包管理器 ...
- CF1110C Meaningless Operations
思路: 令x为满足2x <= a的最大的x.如果a的二进制表示中包含0,则将b构造为(2x+1 - 1) ^ a即可:否则gcd(a ^ b, a & b) = gcd(2x+1 - 1 ...
- Android 坑爹问题
A/art: art/runtime/jdwp/jdwp_event.cc:] Check failed: Thread::Current() != GetDebugThread() (Thread: ...