您的位置:首页 > 其它

UVA - 11624 Fire!两个bfs

2017-01-18 23:24 302 查看
就是有人要安全地从迷宫中逃出来,人在跑的时候,火也在蔓延,问人可不可以跑出来,如果可以,那需要多少时间 呢?

方法,用两个vis数组标记火经过这个点的时候需要多久,人经过这个点的时候需要多久。如果人经过这个点的时间小于火经过这个点的时间,这表示人可以在火蔓延到这个点之前就经过这个点。需要注意一下队列的清空。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
#define maxn 1005
#define INF 0x3f3f3f3f
struct zb
{
int x,y;
// zb(int a,int b):x(a),y(b){}
};
char M[maxn][maxn];
int visf[maxn][maxn];
int visj[maxn][maxn];
int fxx[4]={0,0,1,-1};//下上右左
int fxy[4]={1,-1,0,0};
queue <zb> Q;
int y,x;
void bfsf()
{
while(!Q.empty())
{
zb t=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
int yy=t.y+fxy[i];
int xx=t.x+fxx[i];
if(yy>=0&&yy<y&&xx>=0&&xx<x&&visf[yy][xx]==INF&&M[yy][xx]!='#')
{
visf[yy][xx]=visf[t.y][t.x]+1;
Q.push(zb{xx,yy});
}
}
}
}
int bfsj(zb bg)
{
while(!Q.empty())
Q.pop();
memset(visj,0,sizeof(visj));
Q.push(bg);
visj[bg.y][bg.x]=0;
while(!Q.empty())
{
zb t=Q.front();
Q.pop();
if(visj[t.y][t.x]>=visf[t.y][t.x])
continue;
if(t.x==0||t.x==x-1||t.y==0||t.y==y-1)
return visj[t.y][t.x]+1;
for(int i=0;i<4;i++)
{
int yy=t.y+fxy[i];
int xx=t.x+fxx[i];
if(yy>=0&&yy<y&&xx>=0&&xx<x&&!visj[yy][xx]&&M[yy][xx]!='#')
{
visj[yy][xx]=visj[t.y][t.x]+1;
Q.push(zb{xx,yy});
}
}
}
return -1;
}
int main()
{
int n;
scanf("%d",&n);
while(n
4000
--)
{
memset(M,0,sizeof(M));
memset(visf,INF,sizeof(visf));
while(!Q.empty())
Q.pop();
scanf("%d %d",&y,&x);
for(int i=0;i<y;i++)
scanf("%s",M[i]);
zb bg;
int flag=0;
for(int i=0;i<y;i++)
{
for(int j=0;j<x;j++)
{
if(M[i][j]=='F')
{
flag++;
Q.push(zb{j,i});
visf[i][j]=0;
}
if(M[i][j]=='J')
{
bg.y=i;
bg.x=j;
}
}
}
bfsf();
int p= bfsj(bg);
if(p==-1)
printf("IMPOSSIBLE\n");
else
printf("%d\n",p);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: