传送门
||os[jx][jy]==-1))没有火或者火无法蔓延到的地方
#include <bits/stdc++.h>
using namespace std;
char los[1009][1009];
int os[1009][1009],n,m;
int yy[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
struct ot{int x,y,z;};
queue<ot>ff;
bool check(int a,int b,int n,int m){return a>=0&&a<n&&b>=0&&b<m;}
int jjbfs(int x,int y){
queue<ot>jj;
los[x][y]='#';
jj.push({x,y,0});
while(!jj.empty()){
ot q=jj.front();
jj.pop();
if(q.x==0||q.x==n-1||q.y==0||q.y==m-1)
return q.z+1;
for(int i=0;i<4;i++){
int jx=q.x+yy[i][0];
int jy=q.y+yy[i][1];
if(check(jx,jy,n,m)&&los[jx][jy]!='#'&&(os[jx][jy]>q.z+1||os[jx][jy]==-1)){//没有火或者火无法蔓延到的地方
los[jx][jy]='#';
jj.push({jx,jy,q.z+1});
}
}
}
return 0;
}
int main()
{
int t,i,j,fx,fy,x,y;
ot w;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(os,-1,sizeof(os));
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cin>>los[i][j];
//scanf(" %c",&los[i][j]);空格很重要!!!不写会比较麻烦
if(los[i][j]=='J'){
x=i;
y=j;
}
if(los[i][j]=='F'){
ff.push({i,j,0});
os[i][j]=0;
}
}
while(!ff.empty()){
w=ff.front();
ff.pop();
for(i=0;i<4;i++){
fx=w.x+yy[i][0];fy=w.y+yy[i][1];
if(check(fx,fy,n,m)&&los[fx][fy]!='#'&&os[fx][fy]==-1){
os[fx][fy]=w.z+1;
//os[fx][fy]=os[w.x][w.y]+1;
ff.push({fx,fy,w.z+1});
}
}
}
int f=jjbfs(x,y);
if(!f)
cout<<"IMPOSSIBLE"<<endl;
else
cout<<f<<endl;
}
return 0;
}
如果把jjfbs()写在主函数里,每组过后要清空放人的队列,队列没有.clear
可以用
void clear(queue &q){
queue<ot>empty;
swap(empty,q);
}