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 ...
随机推荐
- wstring操作与普通段字符操作对照表
字符分类: 宽字符函数普通C函数描述 iswalnum() isalnum() 测试字符是否为数字或字母 iswalpha() isalpha() 测试字符是否是字母 ...
- maven核心概念--插件和目标
maven的核心概念有很多,我们这里先来看Plugins和Goals. 在上一篇博客中,我们用两种类型的命令行参数运行了Maven. 第一条命令,create.这是一条单个的插件目标,Archetyp ...
- 达尔稳usb转RJ45的接口转换器(usb2.0接口)在ubuntu16.04中驱动(r8152)编译安装与使用
淘宝买了usb转RJ45的接口转换器:https://detail.tmall.com/item.htm?id=524808012954&ali_refid=a3_430582_1006:11 ...
- 重置CentOS 7的Root密码
centos7与centos6有很多修改,不一样了,打算写几篇关于日常用到的改动 修改root密码 centos7的用户模式跟6有所不同 1 - 在启动grub菜单,选择编辑选项启动 2 - 按键盘e ...
- 【转】国际GNSS服务组织IGS
国际GNSS服务组织The International GNSS Service,简称IGS,前身为国际GPS服务组织.IGS提供的高质量数据和产品被用于地球科学研究等多个领域. IGS组织由卫星跟踪 ...
- 基础知识全面LINUX
学习Linux系统的重要性应该不用多说,下面我就对Linux的基础知识进行一个全面而又简单的总结.不过建议大家还是装个Linux系统多练习,平时最好只在Linux环境下编程,这样会大有提高. linu ...
- spring使用redis做缓存
缓存 什么是缓存? 在高并发下,为了提高访问的性能,需要将数据库中 一些经常展现和不会频繁变更的数据,存放在存取速率更快的内存中.这样可以 降低数据的获取时间,带来更好的体验 减轻数据库的压力 缓存适 ...
- python 之进程篇
多线程给我们的感觉 1.因为GIL的存在,一个进程的多线程同一时刻只能进去一个,感觉是假的并发 2.只适合I/O密集型的任务 3.针对计算密集型,就挂了(变成串行了) 在python中想要充分利用多核 ...
- 2017年总结的前端文章——一劳永逸的搞定 flex 布局
flex 基本概念 使用 flex 布局首先要设置父容器 display: flex,然后再设置 justify-content: center 实现水平居中,最后设置 align-items: ce ...
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...