uva 11624 fire

来源:互联网 发布:天刀天香捏脸数据导入 编辑:程序博客网 时间:2024/06/16 13:20

这个题,需要不断更新坐标的状态,所以,需要先过一遍bfs,把所有可是被烧到的地方的时间进行标记,然后再次进行bfs的时候,就判断走到那里的时间是否在那个时间之内,就可以,然后思路有了,就是一直wawawa。后来发现一个小错误。

题目的意思解释一下,就是有一个人要逃跑,然后他走的路径,可能会被烧到也可能不会,烧的话是每秒都更新位置,从最开始的位置开始烧,然后向四周扩散,所以需要判断那个人走的最短路,走的路径上是否有火

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>using namespace std;const int MAXN=1010;int n,m;char g[MAXN][MAXN];queue<pair<int,int> >q;int a[MAXN][MAXN];int mov[][2]= {{0,1},{0,-1},{1,0},{-1,0}};void bfs1(){    memset(a,-1,sizeof(a));    while(!q.empty())q.pop();    for(int i=0; i<n; i++)        for(int j=0; j<m; j++)            if(g[i][j]=='F')            {                a[i][j]=0;                q.push(make_pair(i,j));            }    while(!q.empty())    {        pair<int,int> tmp=q.front();        q.pop();        int x=tmp.first;        int y=tmp.second;        for(int i=0; i<4; i++)        {            int tx=x+mov[i][0];            int ty=y+mov[i][1];            if(tx<0||ty<0||tx>=n||ty>=m)continue;            if(a[tx][ty]!=-1)continue;            if(g[tx][ty]=='#')continue;            a[tx][ty]=a[x][y]+1;            q.push(make_pair(tx,ty));        }    }}int b[MAXN][MAXN];int bfs2(){    memset(b,-1,sizeof(b));    while(!q.empty())q.pop();    for(int i=0; i<n; i++)        for(int j=0; j<m; j++)            if(g[i][j]=='J')            {                q.push(make_pair(i,j));                b[i][j]=0;            }    while( !q.empty() )    {        pair<int,int> tmp=q.front();        q.pop();        int x=tmp.first;        int y=tmp.second;        if(x==0 || y==0 || x==n-1 || y==m-1)            return b[x][y]+1;        for(int i=0; i<4; i++)        {            int tx=x+mov[i][0];            int ty=y+mov[i][1];            if(tx<0||ty<0||tx>=n||ty>=m)continue;            if(b[tx][ty]!=-1)continue;            if(g[tx][ty]=='#')continue;            if(a[tx][ty]!=-1 && b[x][y]+1>=a[tx][ty])continue;            b[tx][ty]=b[x][y]+1;            q.push(make_pair(tx,ty));        }    }    return -1;}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]);        bfs1();        int ans=bfs2();        if(ans==-1)printf("IMPOSSIBLE\n");        else printf("%d\n",ans);    }    return 0;}


原创粉丝点击