题目链接

分析:
火是不会自动熄灭的
所以我们先预处理出火蔓延到每一个格子的最早时间
然后bfsJoe的行动路线就可以了

tip

我把所有的信息都放在一个矩阵中维护
结果就一直WA
然后我就把火和地图两个信息分别维护
就变成了RE
(鬼知道为什么。。。有人愿意解答吗???!!!)

//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

const int N=1002;
int zz[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int mp[N][N],xx,yy;
int n,m,f[N][N];
int q[N*N][2],tou,wei;

void bfs1()
{
    do
    {
        int x=q[++tou][0];
        int y=q[tou][1];
        int time=f[x][y]+1;
        int xa,ya;
        for (int i=0;i<4;i++)
        {
            xa=x+zz[i][0];
            ya=y+zz[i][1];
            if (xa>n||ya>m||xa<1||ya<1||f[xa][ya]!=0||mp[xa][ya]==-1) continue;
            f[xa][ya]=time;
            wei++;
            q[wei][0]=xa;
            q[wei][1]=ya;
        }
    }
    while (tou<wei);
}

int bfs2()
{
    tou=wei=0;
    q[++wei][0]=xx;
    q[wei][1]=yy;
    mp[xx][yy]=1;
    do
    {
        int x=q[++tou][0];
        int y=q[tou][1];
        int xa,ya;
        if (x>=n||y>=m||x<=1||y<=1) return mp[x][y];
        int time=mp[x][y]+1;
        for (int i=0;i<4;i++)
        {
            xa=x+zz[i][0];
            ya=y+zz[i][1];
            if (mp[xa][ya]==-1||f[xa][ya]<=time) continue;
            mp[xa][ya]=time;
            wei++;
            q[wei][0]=xa;
            q[wei][1]=ya;
        }
    }
    while (tou<wei);
    return 0;
}

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        memset(mp,0,sizeof(mp));
        memset(f,0,sizeof(f));
        tou=wei=0;
        scanf("%d%d",&n,&m);
        char s[N];
        for (int i=1;i<=n;i++)
        {
            scanf("%s",&s);
            for (int j=0;j<m;j++)
                if (s[j]=='#') mp[i][j+1]=-1;
                else if (s[j]=='F')
                {
                    q[++wei][0]=i;
                    q[wei][1]=j+1;
                    f[i][j+1]=1;
                }
                else if (s[j]=='J') xx=i,yy=j+1;
        }
        bfs1();   //fire
        int ans=bfs2();
        if (ans>0)  //Jeo
            printf("%d\n",ans);   
        else printf("IMPOSSIBLE\n");
    }
    return 0;
}