#include <bits/stdc++.h>
using namespace std;
int h,w,n;
char s[1005][1005];
int dx[4]={0,0,-1,1},dy[4]={-1,1,0,0};
int vis[1005][1005][2];
struct State{
int x,y,step,st;
};
int bfs2(int sx,int sy,int ex,int ey){
queue<State> q;
q.push({sx,sy,0,0});
vis[sx][sy][0]=1;
while(!q.empty()){
int nowx=q.front().x,nowy=q.front().y;
int step=q.front().step,st=q.front().st;
if(nowx==ex&&nowy==ey) return q.front().step;
if(st==1){
for(int i=0;i<2;i++){
int nextx=nowx+dx[i];
int nexty=nowy+dy[i];
if(nextx<0||nextx>=h||nexty<0||nexty>=w||vis[nextx][nexty][0]==1||s[nextx][nexty]=='#') continue;
q.push({nextx,nexty,step+1,0});
vis[nextx][nexty][0]=1;
}
}
else {
for(int i=2;i<4;i++){
int nextx=nowx+dx[i];
int nexty=nowy+dy[i];
if(nextx<0||nextx>=h||nexty<0||nexty>=w||vis[nextx][nexty][1]==1||s[nextx][nexty]=='#') continue;
q.push({nextx,nexty,step+1,1});
vis[nextx][nexty][1]=1;
}
}
q.pop();
}
return -1;
}
int main(){
cin>>h>>w;
int sx,sy,ex,ey;
for(int i=0;i<h;i++){
for(int j=0;j<w;j++){
cin>>s[i][j];
if(s[i][j]=='S'){
sx=i,sy=j;
}
if(s[i][j]=='G') ex=i,ey=j;
}
}
cout<<bfs2(sx,sy,ex,ey);
return 0;
}
样例3过不去