#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define rep(i,j) REP((i), 0, (j)) #define REP(i,j,k) for(int i=(j);(i)<(k);++i) #define BW(a,x,b) ((a)<=(x)&&(x)<=(b)) #define ALL(v) (v).begin(), (v).end() #define LENGTHOF(x) (sizeof(x) / sizeof(*(x))) #define AFILL(a, b) fill((int*)a, (int*)(a + LENGTHOF(a)), b) #define SQ(x) ((x)*(x)) #define Mod(x, mod) (((x)+(mod)%(mod)) #define MP make_pair #define PB push_back #define Fi first #define Se second #define INF (1<<29) #define EPS 1e-10 #define MOD 1000000007 typedef pair pi; typedef pair pii; typedef pairpipi; typedef vector vi; typedef queue qi; typedef long long ll; int dc[2]={8,4}; int dx[2][8]={{-2,-1,1,2,2,1,-1,-2},{-1,1,1,-1}}; int dy[2][8]={{-1,-2,-2,-1,1,2,2,1},{-1,1,-1,1}}; int dp[2][512][512]; int H, W; string m[512]; int dfs(int c, int x, int y){ // cout << c << " " << x << " " << y << endl; if(m[x][y] == 'G') return 0; if(m[x][y] == 'R') c = 1-c; int ret = INF; rep(d,dc[c]){ } return ret; } int main() { rep(i, 2) rep(j, 512) rep(k, 512) dp[i][j][k] = INF; cin >> H >> W; rep(i, H) cin >> m[i]; int x=0,y=0; rep(i, H) rep(j, W) if(m[i][j] == 'S'){ x = i; y = j; } priority_queue, greater >PQ; // dp[0][x][y] = 0; PQ.push(pipi(pi(0, 0), pi(x, y))); while(!PQ.empty()){ pipi p = PQ.top(); PQ.pop(); int t = p.first.first, c = p.first.second; x = p.second.first, y = p.second.second; if(dp[c][x][y] <= t) continue; // cout << t << " " << c << " " << x << " " << y << endl; dp[c][x][y] = t; if(m[x][y] == 'G'){ cout << t << endl; return 0; } if(m[x][y] == 'R') c = 1-c; rep(d,dc[c]){ int nx=x+dx[c][d], ny=y+dy[c][d]; if(nx < 0 || nx >= H || ny < 0 || ny >= W) continue; PQ.push(pipi(pi(t+1,c), pi(nx,ny))); } } cout << -1<< endl; return 0; }