题意:一个迷宫起火了,判断joe能否从迷宫中跑出来
分析:用两次bfs,一次求火蔓延到点的时间,一次joe逃跑
坑点:好几个地方起火,WA到怀疑人生!!!!!
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 10000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef pair <int,int> pii;
const int maxn = 1000+5 , inf = 0x3f3f3f3f;
char G[maxn][maxn];
int vis[maxn][maxn];
int t[maxn][maxn];
int n,m;
const int dx[]={1,-1,0,0};
const int dy[]={0,0,-1,1};
struct Node{
int x,y,d;
Node(int xx,int yy,int dd):x(xx),y(yy),d(dd){};
};
vector<Node>fires;
bool can(int x,int y){
if(1<=x&&x<=n&&1<=y&&y<=m&&G[x][y]!='#') return true;
return false;
}
void bfs1(){
queue<Node>q;
for(int i=0;i<fires.size();i++){
int x = fires[i].x;
int y = fires[i].y;
q.push(Node(x,y,1));
vis[x][y] = 1;
}
while(!q.empty()){
Node now = q.front();q.pop();
for(int i=0;i<4;i++){
int nx = now.x+dx[i];
int ny = now.y+dy[i];
if(can(nx,ny)&&!vis[nx][ny]){
t[nx][ny] = now.d;
q.push(Node(nx,ny,now.d+1));
vis[nx][ny]=1;
}
}
}
}
bool judge(Node now){
if(now.x==n||now.x==1||now.y==1||now.y==m) return true;
return false;
}
int bfs(int jx,int jy){
vis[jx][jy]=1;
Node tmp(jx,jy,0);
queue<Node>q;
q.push(tmp);
while(!q.empty()){
Node now = q.front();q.pop();
if(judge(now)){
return now.d+1;
}
for(int i=0;i<4;i++){
int nx = now.x+dx[i];
int ny = now.y+dy[i];
if(!vis[nx][ny]&&now.d+1<t[nx][ny]&&G[nx][ny]!='#'){
q.push(Node(nx,ny,now.d+1));
vis[nx][ny]=1;
}
}
}
return -1;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--){
fires.clear();
int jx,jy;
memset(t,inf,sizeof(t));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf(" %c",&G[i][j]);
if(G[i][j]=='J'){
jx = i;
jy = j;
}
if(G[i][j]=='F'){
t[i][j]=0;
fires.push_back(Node(i,j,1));
}
}
}
mem(vis);
bfs1();
mem(vis);
int ans = bfs(jx,jy);
if(ans!=-1) cout<<ans<<endl;
else cout<<"IMPOSSIBLE"<<endl;
}
}