FZU - 2150 bfs [kuangbin带你飞]专题一
题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃。如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1.
思路:先求整个草坪的联通块数量cnt。
1.如果cnt大于2,一定不能点燃全图,输出-1
2.如果cnt等于2,分别在两个联通块枚举每个点中找最短时间,最后答案就是max(time1, time2)
3.如果cnt等于1,此题的关键点。枚举两个点作为bfs的两个起点,注意是两个起点,bfs求在这个两块中,到达任意一点至少需要的时间。最后的答案就是枚举的所有情况的最小时间。 PS:我用了另外一种判断最小时间,没考虑到一种特殊情况错了一下午。
AC代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 15;
char G[maxn][maxn];
int vis[maxn][maxn], d[maxn][maxn];
const int dx[] = {1,-1,0,0};
const int dy[] = {0,0,-1,1};
int n, m;
void dfs(int x, int y, int flag) {
vis[x][y] = flag;
for(int i = 0; i < 4; ++i){
int px = x + dx[i], py = y + dy[i];
if(px < 0 || py < 0 || px >= n || py >= m) continue;
if(G[px][py] == '#' && !vis[px][py]) dfs(px, py, flag);
}
}
int bfs(int x, int y, int xx, int yy){
memset(d, -1, sizeof(d));
int ans = 0;
queue<int>q;
q.push(x * m + y);
q.push(xx * m + yy);
d[x][y] = d[xx][yy] = 0;
while(!q.empty()) {
int pos = q.front();
q.pop();
x = pos / m, y = pos % m;
for(int i = 0; i < 4; ++i){
int px = x + dx[i], py = y + dy[i];
if(px < 0 || py < 0 || px >= n || py >= m) continue;
if(G[px][py] == '#' && d[px][py] == -1){
d[px][py] = d[x][y] + 1;
q.push(px * m + py);
ans = max(ans, d[px][py]);
}
}
}
return ans;
}
int main(){
int T;
scanf("%d", &T);
int kase = 1;
while(T--){
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) scanf("%s", G[i]);
printf("Case %d: ", kase++);
memset(vis, 0, sizeof(vis));
int cnt = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) {
if(G[i][j] == '#' && !vis[i][j]) {
++cnt;
dfs(i, j, cnt);
}
}
if(cnt > 2) printf("-1\n");
else if(cnt == 2) {
int inf = 1 << 30;
int ans[] = {inf, inf};
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j){
if(G[i][j] == '#') {
int h = vis[i][j] - 1;
int a = bfs(i, j, i, j);
ans[h] = min(ans[h], a);
}
}
printf("%d\n", max(ans[0], ans[1]));
}
else if(cnt == 1){
int ans = 1 << 30;
for(int i = 0; i < n * m; ++i) {
int x1 = i / m, y1 = i % m;
if(G[x1][y1] != '#') continue;
for(int j = i + 1; j < n * m; ++j) {
int x2 = j / m, y2 = j % m;
if(G[x2][y2]!= '#') continue;
int h = bfs(x1, y1, x2, y2);
ans = min(ans, h);
}
}
if(ans == 1 << 30) ans = 0;
printf("%d\n", ans);
}
else if(cnt == 0) printf("-1\n");
}
return 0;
}
如有不当之处欢迎指出!
FZU - 2150 bfs [kuangbin带你飞]专题一的更多相关文章
- HDU - 3533 bfs [kuangbin带你飞]专题二
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...
- HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二
思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...
- UVA - 11624 多点bfs [kuangbin带你飞]专题一
题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...
- POJ - 2251 bfs [kuangbin带你飞]专题一
立体bfs,共有六个方向: const int dx[] = {0,0,1,-1,0,0}; const int dy[] = {1,-1,0,0,0,0}; const int dz[] = {0, ...
- POJ - 3414 bfs [kuangbin带你飞]专题一
状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...
- POJ - 3984 bfs [kuangbin带你飞]专题一
bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...
- HDU - 2612 bfs [kuangbin带你飞]专题一
分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处: 通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...
- HDU - 1495 bfs [kuangbin带你飞]专题一
模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...
- HDU - 1241 dfs or bfs [kuangbin带你飞]专题一
8个方向求联通块,经典问题. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #includ ...
随机推荐
- Linux指令--chmod
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- 流API--原始类型流
到目前为止,我们已经将整型收集到了一个Stream<Integer>的流中,不过将每个整数包装成相应对象显然是一个低效的做法,对于其他的基本类型也是一样,我们前面说过jdk提供包装类已经自 ...
- linux中操作java进程
通过 ps -ef|grep java 来得到真正运行的线程 通过kill -9 XXXXX来杀死正在运行的线程,其中XXXXX是上面java线程的序号. 另外还有2个指令我也不熟悉,一个是cat,一 ...
- 如何用Python爬虫实现百度图片自动下载?
Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ...
- Linux服务器删除乱码文件和文件夹的方法
Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对 ...
- 老凡原创PHPcms发布上架chinaz
FanCms内容管理系统(3网兼容) FanCms内容管理系统(3网兼容)核心使用CodeIgniter框架.使用SQlite数据库,不需要安装,上传到任意支持PHP的空间,就能使用.高级URL自定义 ...
- div仿td标签属性
链接:https://pan.baidu.com/s/1kW1At9d 密码:g0he 这里说的div是指固定大小的,动态往里面填充文字的时候,文字一直水平垂直居中(换行也是).就和td标签一样.当然 ...
- xBIM 多个IFC文件合并
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- es故障节点恢复后加入集群导致删除索引重新出现
es的每个shard下的文件都可以看做一个完整的lucene文件,shard数据目录下的segment文件包含了索引的分片数量,副本数量.es shard可以恢复,就是因为每个shard都包含了一份数 ...
- WPF中的Command事件绑定
在项目中使用Command绑定能够使我们的代码更加的符合MVVM模式.不了解的同学可能不清楚,只有继承自ButtonBase类的元素才可以直接绑定Command(Button.CheckBox.Rad ...