题意:某人身陷火场,总有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带你飞]专题一的更多相关文章

  1. HDU - 3533 bfs [kuangbin带你飞]专题二

    看了好久的样例才看懂. 题意:有一个人要从(0,0)走到(n,m),图中有k个碉堡,每个碉堡可以向某个固定的方向每隔t秒放一次炮,炮弹不能穿越另一个碉堡,会被阻挡.人在移动的过程中不会被炮弹打到,也就 ...

  2. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...

  3. 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, ...

  4. FZU - 2150 bfs [kuangbin带你飞]专题一

    题意:两个人玩很变态的游戏,将一个草坪的某两个点点燃,点燃的草坪可以向上下左右四个方向扩散,问能否将整块草坪上面的草都点燃.如果能,输出最短时间(^_^他们就能玩更变态的游戏了),如果不能,输出-1. ...

  5. POJ - 3414 bfs [kuangbin带你飞]专题一

    状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...

  6. POJ - 3984 bfs [kuangbin带你飞]专题一

    bfs搜索过程中将路径保存下即可. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #inc ...

  7. HDU - 2612 bfs [kuangbin带你飞]专题一

    分别以两个人的家作为起点,bfs求得到每个KFC最短距离.然后枚举每个KFC,求得时间之和的最小值即可. 此题不符合实际情况之处:  通过了一个KFC再去另一个KFC可以吗? 出题人都没好好想过吗? ...

  8. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  9. HDU - 1241 dfs or bfs [kuangbin带你飞]专题一

    8个方向求联通块,经典问题. AC代码 #include<cstdio> #include<cstring> #include<algorithm> #includ ...

随机推荐

  1. 【转】UNIX时间戳与.net日期类的转换

    1 将系统时间转换成UNIX时间戳   DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,1,1)); ...

  2. 【转】centos安装vim7.4

    centos安装vim7.4   系统版本centos6.4; root权限 su - root     卸载 $ rpm -qa | grep vim $ yum remove vim vim-en ...

  3. 零基础实现node+express个性化聊天室

    本篇文章使用node+express+jquery写一个个性化聊天室,一起来get一下~(源码地址见文章末尾) 效果图 项目结构 实现功能 登录检测 系统自动提示用户状态(进入/离开) 显示在线用户 ...

  4. linux监控下几个系统工具

    1.top 2.htop(yum install -y htop) 3.glances(yum install -y glances) 4.dstat -l -c -m -d  -r -n --top ...

  5. mysql修改root用户密码

    自我总结,欢迎拍砖! 目的:若root用户密码忘记,则需要重新设置root用户的密码. 步骤: 1.找到mysql安装目录下的 my.ini 文件,找到[mysqlId]一行,在下方添加语句:skip ...

  6. Chocolatey 和 Redis windows安装记录

    前言 最近研究redis,发现Redis没有官方的windows版本,但MsOpenTech有一直维护对应的Redis版本,其下载地址如下: https://github.com/MSOpenTech ...

  7. .net中关于Windows窗体程序和Web网站程序调用自己的服务

    在.NET Framework 4.0创建服务是中没有像3.5那样的选择新建-网站-ASP.NET Web服务模块,但在4.0中可以选择 新建-网站-ASP.NET空网站-选中项目右键添加新项- 选择 ...

  8. Spring国际化

    国际化(Internationalization)有时候被简称为i18n,因为有18个字母在国际化的英文单词的字母i和n之间.Spring对国际化的支持示例如下所示. 需要将spring.tld放到工 ...

  9. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  10. .NET Core版本七牛云SDK使用

    一.问题背景 公司目前正在将一部分的业务从.NET平台准备迁移到.NET Core上去,同时也准备启用docker进行.NET Core的部署,在项目迁移过程中,不可避免的碰到有些SDK只有在.NET ...