#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<set>
using namespace std;
const int INF=1000000000;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
const int maxr=1000+10;
const int maxc=1000+10;
int r,c;
char mat[maxr][maxc];
int d[maxr][maxc][2];
int vis[maxr][maxc][2];
int ans;
struct Cell
{
int x,y;
Cell(int x=0,int y=0):x(x),y(y){}
};
queue<Cell> que;
void bfs(int kind)
{
while(!que.empty())
{
Cell p=que.front();
que.pop();
for(int i=0;i<4;i++)
{
int xx=p.x+dir[i][0];
int yy=p.y+dir[i][1];
if(xx<r&&xx>=0&&yy<c&&yy>=0&&mat[xx][yy]=='.'&&!vis[xx][yy][kind])
{
que.push(Cell(xx,yy));
vis[xx][yy][kind]=1;
d[xx][yy][kind]=d[p.x][p.y][kind]+1;
}
}
}
}
void check(int x,int y)
{
if(mat[x][y]!='.'||!vis[x][y][0])return ;
if(!vis[x][y][1]||d[x][y][0]<d[x][y][1])ans=min(ans,d[x][y][0]+1);
}
int main()
{
int t;
int jr,jc;
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%d %d",&r,&c);
getchar();
vector<Cell> fires;
//memset(vis,0,sizeof(vis));
for(int i=0;i<r;i++)
{
scanf("%s",mat[i]);
getchar();
for(int j=0;j<c;j++)
{
if(mat[i][j]=='J')
{
jr=i;
jc=j;
mat[i][j]='.';
//que.push(Cell(jr,jc));
//d[jr][jc][0]=0;
//vis[jr][jc][0]=1;
}
else
{
if(mat[i][j]=='F')
{
fires.push_back(Cell(i,j));
mat[i][j]='.';
//d[i][j][1]=0;
//vis[i][j][1]=1;
}
}
}
}
ans=INF;
memset(vis,0,sizeof(vis));
que.push(Cell(jr,jc));
d[jr][jc][0]=0;
vis[jr][jc][0]=1;
bfs(0);
for(int i=0;i<fires.size();i++)
{
d[fires[i].x][fires[i].y][1]=0;
vis[fires[i].x][fires[i].y][1]=1;
que.push(Cell(fires[i].x,fires[i].y));
}
bfs(1);
for(int i=0;i<r;i++)
{
check(i,0);
check(i,c-1);
}
for(int i=0;i<c;i++)
{
check(0,i);
check(r-1,i);
}
if(ans==INF)printf("IMPOSSIBLE\n");
else printf("%d\n",ans);
}
return 0;
}
UVa11624 Fire!(BFS+迷宫)
最新推荐文章于 2024-09-10 13:21:04 发布