#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
string s[1005];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int vis[1005][1005];
struct point{
int x,y,step,last;
};
queue<point>q;
int bfs(int sx,int sy){
vis[sx][sy]=1;
q.push({sx,sy,0,2});
q.push({sx,sy,0,0});
while(!q.empty()){
auto po=q.front();
q.pop();
int x=po.x;
int y=po.y;
int step=po.step;
int last=po.last;
// printf("(%d,%d,%d,%d)\n",x,y,step,last);
if(s[x][y]=='G'){
return step;
}
if(0<=last&&last<=1){
for(int i=2;i<=3;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>m) continue;
if(s[xx][yy]=='#') continue;
if(vis[xx][yy]>10) continue;
vis[xx][yy]++;
q.push({xx,yy,step+1,i});
}
}
else if(2<=last&&last<=3){
for(int i=0;i<=1;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>m) continue;
if(s[xx][yy]=='#') continue;
if(vis[xx][yy]>10) continue;
vis[xx][yy]++;
q.push({xx,yy,step+1,i});
}
}
}
return -1;
}
signed main(){
cin>>n>>m;
int sx,sy;
for(int i=1;i<=n;i++){
cin>>s[i];
s[i]=" "+s[i];
for(int j=1;j<=m;j++){
if(s[i][j]=='S'){
sx=i,sy=j;
}
}
}
cout<<bfs(sx,sy);
}
Wa了9个点