Fire

#include<iostream>
#include<cstring>
#include<queue>
#include<string>
using namespace std;
# define MAXN 10000
int n,m;
char mapp[MAXN][MAXN];
int Fire[MAXN][MAXN];
int Peo[MAXN][MAXN];
int flag;
int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
struct node
{
    int xi;
    int yi;
    int step;
    node() {}
    node(int xx,int yy,int zz)
    {
        xi=xx;
        yi=yy;
        step=zz;
    }
};
int  BfsPeo(int t1,int t2)
{
    memset(Peo,-1,sizeof(Peo));
    Peo[t1][t2]=0;
    queue<node>q;
    q.push(node(t1,t2,0));
    int g=-1;
    while(!q.empty())
    {
        node temp=q.front();
        q.pop();
        int x=temp.xi;
        int y=temp.yi;
        int z=temp.step;
        if(x==1||x==n||y==1||y==m)
        {
        g=z+1;
            break;
        }
        for(int i=0; i<4; i++)
        {
            int xi=x+f[i][0];
            int yi=y+f[i][1];
            if(xi<=0||xi>n||yi<=0||yi>m)continue;
            if(mapp[xi][yi]!='.')continue;
            if(Peo[xi][yi]!=-1)continue;
            if(Fire[xi][yi]!=-1&&(Peo[x][y]+1>=Fire[xi][yi]))continue;
            Peo[xi][yi]=Peo[x][y]+1;
            q.push(node(xi,yi,z+1));
        }
    }
    return g;
}
void BfsFire(int t1,int t2)
{
    memset(Fire,-1,sizeof(Fire));
    Fire[t1][t2]=0;
    queue<node>q;
    q.push(node(t1,t2,0));
    while(!q.empty())
    {
        node temp=q.front();
        q.pop();
        int x=temp.xi;
        int y=temp.yi;
        int z=temp.step;
        for(int i=0; i<4; i++)
        {
            int xi=x+f[i][0];
            int yi=y+f[i][1];
            if(xi<=0||xi>n||yi<=0||yi>m)continue;
            if(Fire[xi][yi]!=-1)continue;
            if(mapp[xi][yi]!='.')continue;
            Fire[xi][yi]=Fire[x][y]+1;
            q.push(node(xi,yi,z+1));
        }
    }
    return ;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        int t1,t2,s1,s2;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
            {
                cin>>mapp[i][j];
                if(mapp[i][j]=='J')
                {
                    t1=i;
                    t2=j;
                }
                if(mapp[i][j]=='F')
                {
                    s1=i;
                    s2=j;
                }
            }
        }
        BfsFire(s1,s2);
        int e=BfsPeo(t1,t2);
        if(e==-1)
            cout<<"IMPOSSIBLE"<<endl;
        else
            cout<<e<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/let_life_stop/article/details/80713627