E - Fire! (双向bfs)
创始人
2024-02-08 07:04:34

UVA-11624-Fire!

 

题意:在n*m的网格内,有一个人和n堆火,人可以往上下左右四个方向走,同时所有的火也会想四周蔓延,问你人可不可以在火包围他之前逃离这个n*m的范围。

思路:问人可不可以逃离这个范围,就是看人能不能走到最外面的一圈的格子。但是人在走的时候火也会走,那么我们就要进行人 和火的同时的bfs,人和火同时bfs同时更新状态,首先对于人,人先往四周bfs,但是问题来了,我们怎么判断什么时候这一轮人的bfs应该停止去进行火的bfs——————我们可以在每次bfs之前去记录队列中包含的元素,只要对队列的元素进行 bfs就可以停止了,之后对火的bfs就可以了。但是有个问题需要注意一下,就是当人的bfs之后,火可能会把人能走的位置直接封住,但是人的可能的情况已经进入队列了,我们再删除也不好处理,那么我们可以逆向思维先bfs火的范围的,因为火如果先走的话那么人直接走能走的点就可以了

那么最后的整体的框架就是:

先bfs火能走的范围

然后bfs人能走的范围

每次bfs的次数是bfs之前队列的元素的个数

注意最后到达最外圈的结果应该要+1才能出去

最后我bfs的标记写错了,我的每次标记时是在出队的时候再标记

但是正确的标记应该是在入队的时候就去标记,因为如果是在出队时才标记,那么可能会标记很多重复的元素导致t(比如我入队了{1,2,3}三个元素,然后到1这个元素的时候也可能会入队{2,3}这两个元素,而先标记1 2 3三个元素在之后就不会出现重复入队的情况),当时就卡了这个点qwq!!!

代码

/***  ┏┓   ┏┓+ +* ┏┛┻━━━┛┻┓ + +* ┃       ┃* ┃   ━   ┃ ++ + + +*  ████━████+*  ◥██◤ ◥██◤ +* ┃   ┻   ┃* ┃       ┃ + +* ┗━┓   ┏━┛*   ┃   ┃ + + + +Code is far away from  *   ┃   ┃ + bug with the animal protecting*   ┃    ┗━━━┓ 神兽保佑,代码无bug *   ┃  	    ┣┓*    ┃        ┏┛*     ┗┓┓┏━┳┓┏┛ + + + +*    ┃┫┫ ┃┫┫*    ┗┻┛ ┗┻┛+ + + +*/#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define sc_int(x) scanf("%d", &x)
#define sc_ll(x) scanf("%lld", &x)
#define pr_ll(x) printf("%lld", x)
#define pr_ll_n(x) printf("%lld\n", x)
#define pr_int_n(x) printf("%d\n", x)
#define ll long long
using namespace std;const int N = 1000000 + 100;
int n, m, h;
ll s[N];
char Map[1010][1010];struct lk
{int x;int y;int cnt;
};
queue q, p;
int dirx[5] = {0, 1, 0, -1, 0};
int diry[5] = {0, 0, -1, 0, 1};
bool st[1010][1010];
bool stf[1010][1010];void bfs(int a, int b)
{q.push({a, b, 0});st[a][b] = 1;int sum=0;while (q.size() ){while (p.size()){lk kk = p.front();if (kk.cnt > sum)break;p.pop();// cout< n || yy < 1 || yy > m)continue;if ( Map[xx][yy] != '.')continue;// cout<sum)break;q.pop();// cout< n || yy < 1 || yy > m)continue;if (st[xx][yy] || Map[xx][yy] == '#'||Map[xx][yy]=='F')continue;st[xx][yy] = 1;					q.push({xx, yy, k.cnt + 1});}}sum++;}cout << "IMPOSSIBLE\n";return;
}int main()
{int t;sc_int(t);while (t--){	memset(st,0,sizeof st);while(q.size())q.pop();while(p.size())p.pop();int x, y;cin >> n >> m;for (int i = 1; i <= n; i++)cin >> Map[i] + 1;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (Map[i][j] == 'F'){p.push({i, j, 0});stf[i][j] = 1;}if (Map[i][j] == 'J'){x = i;y = j;}}}bfs(x, y);}return 0;
}

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...