UVA - 11624 多点bfs [kuangbin带你飞]专题一
题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离。
思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人到达火场各点的最短距离。枚举边界点,如果人到达某边界点的最短距离小于最短着火点到达的距离,则说明该点可以作为逃生的出口。
该题需要注意的地方:
1.可能没有着火点。我在这里WA了
2.
对于这种数据:
1
4 4
FFFF
####
.J.#
....
答案: 2
但是我的AC代码对于这种情况无法得到正确答案,说明该题测试数据没有考虑这个数据。赤果果的不严谨啊!
解决这种情况的办法就是全部初始化为一个极大的数inf,将答案ans设置为 10^6 < ans < inf就可以得到正确答案了。
贴上有BUG的AC代码
#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
char G[maxn][maxn];
int d[2][maxn][maxn];
int n, m;
struct node{
int x, y;
node(){
}
node(int x, int y):x(x), y(y){
}
};
vector<node>fire;
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};
void bfs(int c) {
queue<node>q;
for(int i = 0; i < fire.size(); ++i) {
int x = fire[i].x, y = fire[i].y;
d[c][x][y] = 0;
q.push(node(x, y));
}
while(!q.empty()) {
node p = q.front();
q.pop();
int x = p.x, y= p.y;
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[c][px][py] != -1) continue;
d[c][px][py] = d[c][x][y] + 1;
q.push(node(px, py));
}
}
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) scanf("%s", G[i]);
int x, y;
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) {
if(G[i][j] == 'F') fire.push_back(node(i, j));
if(G[i][j] == 'J') {
x = i, y = j;
}
}
int cnt = fire.size();
memset(d, -1, sizeof(d));
if(cnt) bfs(0);
fire.clear();
fire.push_back(node(x, y));
bfs(1);
int inf = 1 << 30;
int ans = inf;
// 枚举边界
for(int i = 0; i < m ; ++i){
if(cnt == 0) d[0][0][i] = d[0][n - 1][i] = inf + 1;
if(d[1][0][i] < d[0][0][i] && G[0][i] != '#')
ans = min(ans, d[1][0][i]);
if(d[1][n - 1][i] < d[0][n - 1][i] && G[n - 1][i] != '#')
ans = min(ans, d[1][n - 1][i]);
}
for(int i = 0; i < n; ++i) {
if(cnt == 0) d[0][i][0] = d[0][i][m - 1] = inf + 1;
if(d[1][i][0] < d[0][i][0] && G[i][0] != '#')
ans = min(ans, d[1][i][0]);
if(d[1][i][m - 1] < d[0][i][m - 1] && G[i][m - 1] != '#')
ans = min(ans, d[1][i][m - 1]);
}
if(ans == inf) printf("IMPOSSIBLE\n");
else printf("%d\n", ans + 1);
fire.clear();
}
return 0;
}
如有不当之处欢迎指出!
UVA - 11624 多点bfs [kuangbin带你飞]专题一的更多相关文章
- HDU - 3533 bfs [kuangbin带你飞]专题二
看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...
- HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二
思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...
- 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, ...
- FZU - 2150 bfs [kuangbin带你飞]专题一
题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...
- 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 ...
随机推荐
- CSS深入理解学习笔记之overflow
1.Overflow基本属性 overflow:visible(默认)/hidden/scroll/auto/inherit; visible:超出部分可见. hidden:超出部分隐藏. scrol ...
- 移动端 -webkit-user-select:text; ios10 bug 解决方案
移动端一般body的css.会设置 作用就不解释了: body{ height:100%;min-height:100%; font-family: "微软雅黑",'Helveti ...
- python 中 reversed()函数
一个列表a: a=[1,2,3,4,5,6,7] 一个对象b: b=reversed(a) 输出: print(b) <list_reverseiterator object at 0x0000 ...
- Mysql基本命令二
删除id>10的记录:delete from user where id>10; 设置user表的自增字段起始值为10:alter table user anto_increment=10 ...
- LIUNX-Centos 7 编译GDAL
一.准备工作 安装编译环境 sudo yum install gcc gcc-c++ gcc-g77 flex bison autoconf automake bzip2-devel zlib-dev ...
- sizeof和strlen的使用
sizeof和strlen的使用 1. sizeof 其值在编译时就计算好了,所以不能用来返回动态分配的内存空姐的大小. 当参数为下面内容是,所表达的含义: 数组——编译时分配的数组空间大小: 指针— ...
- VLAN 模式下的 OpenStack 管理 vSphere 集群方案
本文不合适转载,只用于自我学习. 关于为什么要用OpenStack 管理 vSphere 集群,原因可以有很多,特别是一些传统企业,VMware 的使用还是很普遍的,用 OpenStack 纳管至少会 ...
- 包装类和基本类型区别?(integer和int取值范围一样大)
1.声明方式不同,int不需要new .Integer需要new 2.性质上根本不同点:int是基本数据类型.Integer是引用数据类型,它有自己的属性,方法 3.存储位置和方式不同:int是存储在 ...
- Mysql 时间格式默认空串 '0000-00-00 00:00:00' select抛出异常的解决方法
Mysql 时间格式默认插入值为空时,会以'0000-00-00 00:00:00'填充,这时如果select时会抛出SQLExecption如下: java.sql.SQLException: Va ...
- java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.classes.views.index_jsp 问题解决方法
本人使用的是taglib作为模板页,然后碰到的这个问题,如果有类似的可以参考. <%@tag description="Overall Page template" page ...