#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define REP(i,n) for(int (i)=0;(i)<(n);(i)++) #define FOR(i,a,b) for(int (i)=(a);(i)<(b);(i)++) #define RREP(i,a) for(int (i)=(a)-1;(i)>=0;(i)--) #define FORR(i,a,b) for(int (i)=(a)-1;(i)>=(b);(i)--) #define PI acos(-1.0) #define DEBUG(C) cout< #define VII vector #define VL vector #define VLL vector #define VD vector #define VDD vector #define PII pair #define PDD pair #define PLL pair #define VPII vector #define ALL(a) (a).begin(),(a).end() #define SORT(a) sort(ALL(a)) #define REVERSE(a) reverse(ALL(a)) #define MP make_pair #define FORE(a,b) for(auto &&a:b) using namespace std; typedef long long LL; typedef unsigned long long ULL; const int INF=1e9; const int MOD=INF+7; int nW[] = { -2, -2, -1, -1, 1, 1, 2, 2 }; int nH[] = { -1, 1, -2, 2, -2, 2, -1, 1 }; int bW[] = { -1, -1, 1, 1 }; int bH[] = { -1, 1, -1, 1 }; struct State{ int H; int W; int step; bool knightFlag; State(int h,int w,int step,bool f){ this->H=h; this->W=w; this->step=step; this->knightFlag=f; } }; int main(void){ int H,W; cin >> H >> W; vector S(H); vector>> is(2,vector>(H,vector(W,false))); int sH,sW; REP(i,H){ cin >> S[i]; REP(j,W){ if(S[i][j]=='S') sH=i,sW=j; } } queue q; q.push(State(sH,sW,0,true)); while(!q.empty()){ State s=q.front(); q.pop(); bool f=s.knightFlag; int nowStep=s.step+1; if(f){ REP(i,8){ int h=s.H+nH[i],w=s.W+nW[i]; if(h<0 || h>=H) continue; if(w<0 || w>=W) continue; if(is[1][h][w]) continue; is[1][h][w]=true; if(S[h][w]=='G'){ cout << nowStep << endl; return 0; } if(S[h][w]=='R'){ q.push(State(h,w,nowStep,!f)); }else{ q.push(State(h,w,nowStep,f)); } } }else{ REP(i,4){ int h=s.H+bH[i],w=s.W+bW[i]; if(h<0 || h>=H) continue; if(w<0 || w>=W) continue; if(is[0][h][w]) continue; is[0][h][w]=true; if(S[h][w]=='G'){ cout << nowStep << endl; return 0; } if(S[h][w]=='R'){ q.push(State(h,w,nowStep,!f)); }else{ q.push(State(h,w,nowStep,f)); } } } } cout << -1 << endl; }