这道题题意:
人必须从起点到终点,且不能越过墙,即使墙被火烧毁,因为人也不能越过火 火的扩展不受任何限制且往8个方向
#include<bits/stdc++.h>
using namespace std;
#define maxm 33
struct node{
int x,y,d;
};
int dx[]={0,1,0,-1,1,1,-1,-1},dy[]={1,0,-1,0,-1,1,1,-1};//定义方向数组
int n,m;
node s,t;
node fire;
string G[maxm];
int vis[maxm][maxm];
int vis2[maxm][maxm];
void bfs2(queue<node>&q){
if(q.empty()==true) return;
int pre=q.front().d;
while(q.empty()==false){
node u=q.front();
if(u.d!=pre) return;
q.pop();
for(int i=0;i<8;i++){
node v={u.x+dx[i],u.y+dy[i],u.d+1};
if(v.x<0||v.x>=n||v.y<0||v.y>=m) continue;
if(vis2[v.x][v.y]) continue;
vis2[v.x][v.y]=1;
q.push(v);
}
}
}
int bfs(){
queue<node>q;
queue<node>q2;
q2.push(fire);
q.push(s);
vis[s.x][s.y]=1;
vis2[fire.x][fire.y]=1;
int pre=0;
while(q.empty()==false){
node u=q.front();
if(u.d!=pre){
bfs2(q2);
pre=u.d;
}
q.pop();
if(u.x==t.x&&u.y==t.y){
return u.d;
}
if(vis2[u.x][u.y]==1) continue;//一定在检验队列里的元素前后再continue
for(int i=0;i<4;i++){
node v={u.x+dx[i],u.y+dy[i],u.d+1};
if(v.x<0||v.x>=n||v.y<0||v.y>=m) continue;//越界检查
if(vis[v.x][v.y]||vis2[v.x][v.y]) continue;//检查走过的路径和火蔓延过的区域
if(G[v.x][v.y]=='#')continue;//是否有墙
vis[v.x][v.y]=1;
q.push(v);
}
}
return -1;
}
void solve(){
cin>>n>>m;
memset(vis,0,sizeof vis);
memset(vis2, 0, sizeof vis2);
for(int i=0;i<n;i++) {
cin>>G[i];
for(int j=0;j<m;j++){
if(G[i][j]=='#');
else if(G[i][j]=='S'){
s={i,j,0};
}
else if(G[i][j]=='E') t={i,j,0};
else if(G[i][j]=='*') fire={i,j,0};
}
}
int res=bfs();
if(res==-1) cout<<"T_T\n";
else cout<<res<<endl;
}
int main(){
int tt;
cin>>tt;
while(tt--){
solve();
}
return 0;
}
/*
1
3 3
*..
..S
.E.
*/