题解:
简单的bfs,我们可以将高位地段周围的八个区域全都给标记为不能走的区域,其实就相当于放上了一堵墙,不过这个放墙的过程可真谓是坑多多。
1.假如你把它旁边的墙标记为‘’,那你样例都过不了,因为隔壁的‘’还会被当成新的一个危险区域,并且扩散至周围。。
2.所以你应该把它周围的换一种标价来标。
3.接着第二个问题,如果你直接把他周围的地区给标记为你自己设置的符号,那如果周围也是一个危险区域,你直接把这个危险区域覆盖住了,这也是不可以的,所以需要判断周围的符号是不是‘*’,如果是的话就不需要标记了

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
const int maxn = 55;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
char a[maxn][maxn];
bool visited[maxn][maxn];
int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool flag=false;
int mins;
struct wazxy{
    int x,y,steps;
    wazxy(int a,int b,int c){x=a,y=b,steps=c;}
};

bool bfs(int x,int y){
    queue<wazxy> q;
    visited[x][y]=true;
    q.push(wazxy(x,y,0));
    while(!q.empty()){
        //cout<<"de"<<endl;
        wazxy temp=q.front();
        q.pop();
        if(a[temp.x][temp.y]=='E'){
            mins=temp.steps;
            return true;
        }
        for(int i=0;i<4;i++){
            int nx=temp.x+dx[i];
            int ny=temp.y+dy[i];
            if((a[nx][ny]=='.'||a[nx][ny]=='E')&&!visited[nx][ny]){
                visited[nx][ny]=true;
                q.push(wazxy(nx,ny,temp.steps+1));
            }
        }
    }
    return false;
}

int main()
{
    cin>>n>>m;
    memset(a,-1,sizeof(a));
    memset(visited,false,sizeof(visited));
    for(int i=1;i<=n;i++){
        scanf("%s",a[i]+1);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='*'){
                if(a[i+1][j]!='*')a[i+1][j]=-1;
                if(a[i][j+1]!='*')a[i][j+1]=-1;
                if(a[i-1][j]!='*')a[i-1][j]=-1;
                if(a[i][j-1]!='*')a[i][j-1]=-1;
                if(a[i+1][j-1]!='*')a[i+1][j-1]=-1;
                if(a[i+1][j+1]!='*')a[i+1][j+1]=-1;
                if(a[i-1][j+1]!='*')a[i-1][j+1]=-1;
                if(a[i-1][j-1]!='*')a[i-1][j-1]=-1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='E') flag=true;
        }
    }

    if(flag==false){
        cout<<"Impossible"<<endl;
        return 0;
    }
    //cout<<"de"<<endl;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]=='S')
                flag=bfs(i,j);
        }
    }
    if(flag) cout<<mins<<endl;
    else cout<<"Impossible"<<endl;
    return 0;
}