#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)--) typedef long long LL; typedef unsigned long long ULL; using namespace std; int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int kh[8] = {1,2,-1,-2,1,2,-1,-2}; int kw[8] = {2,1,-2,-1,-2,-1,2,1}; int bh[4] = {1, -1, -1, 1}; int bw[4] = {1, 1, -1, -1}; int main(){ int H,W; cin>>H>>W; //y=h,x=w int sh,sw,gh,gw; vector s(H); REP(i,H){ cin>>s[i]; if(s[i].find("S")!=-1){ sh=i; sw=s[i].find("S"); } if(s[i].find("G")!=-1){ gh=i; gw=s[i].find("G"); } } //long map[H][W][2]; 最後1ならナイト 0ならミニビショップ vector>> map(H,vector>(W,vector(2,0))); queue h; queue w; queue flag; h.push(sh); w.push(sw); flag.push(true); while(!h.empty()){ int hh,ww; bool f; hh=h.front(); ww=w.front(); f=flag.front(); h.pop(); w.pop(); flag.pop(); if(f){ REP(i,8){ int mh=hh+kh[i],mw=ww+kw[i],d=1; if(mh<0 || mw<0 || mh>=H || mw>=W) continue; if(map[mh][mw][d]&&s[mh][mw]!='R') continue; if(s[mh][mw]=='R') {flag.push(false); d=0;} else flag.push(true); map[mh][mw][d]=map[hh][ww][1]+1; h.push(mh); w.push(mw); } }else{ REP(i,4){ int mh=hh+bh[i],mw=ww+bw[i],d=0; if(mh<0 || mw<0 || mh>=H || mw>=W) continue; if(map[mh][mw][d]&&s[mh][mw]!='R') continue; if(s[mh][mw]=='R') {flag.push(true); d=1;} else flag.push(false); map[mh][mw][d]=map[hh][ww][0]+1; h.push(mh); w.push(mw); } } if(map[gh][gw][0] || map[gh][gw][1]) break; } if(!map[gh][gw][0] && !map[gh][gw][1]) cout<<-1<