这道题题意:

人必须从起点到终点,且不能越过墙,即使墙被火烧毁,因为人也不能越过火 火的扩展不受任何限制且往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.
*/