#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 1000000000 #define rep(i,a,b) for (int i=(a);i<(b);i++) #define rev(i,a,b) for (int i=(a)-1;i>=b;i--) using namespace std; typedef long long ll; typedef pair pii; typedef queue qi; typedef vector vi; typedef vector vs; int dx[4] = { 0, 1, 0, -1 }; int dy[4] = { 1, 0, -1, 0 }; int h, w; char s[500][501]; int m[2][500][500]; int nmx[] = { 1, 2, -1, -2, 1, 2, -1, -2}; int nmy[] = {-2, -1, -2, -1, 2, 1, 2, 1}; int bmx[] = {1, 1, -1, -1}; int bmy[] = {1, -1, 1, -1}; void solve() { int sx, sy; rep(i,0,h) rep(j,0,w) { if(s[i][j] == 'S') { sy = i; sx = j; } } rep(i,0,h) rep(j,0,w) { m[0][i][j] = INF; m[1][i][j] = INF; } qi qx, qy, qt, qbt; qx.push(sx); qy.push(sy); qt.push(0); qbt.push(0); m[0][sy][sx] = 0; while(!qx.empty()) { int x = qx.front(); int y = qy.front(); int t = qt.front(); int bt = qbt.front(); qx.pop(); qy.pop(); qt.pop(); qbt.pop(); if(s[y][x] == 'G') { cout << min(m[0][y][x], m[1][y][x]) << endl; return ; } if(t == 0) { rep(i,0,8) { int mx = x + nmx[i]; int my = y + nmy[i]; if(0 <= mx && mx < w && 0 <= my && my < h) { if(s[my][mx] == 'R') { if(m[1][my][mx] != INF) continue; qt.push(1); m[1][my][mx] = m[t][y][x] + 1; } else { if(m[0][my][mx] != INF) continue; qt.push(0); m[0][my][mx] = m[t][y][x] + 1; } qbt.push(t); qx.push(mx); qy.push(my); } } } else { rep(i,0,4) { int mx = x + bmx[i]; int my = y + bmy[i]; if(0 <= mx && mx < w && 0 <= my && my < h) { if(s[my][mx] == 'R') { if(m[0][my][mx] != INF) continue; qt.push(0); m[0][my][mx] = m[t][y][x] + 1; } else { if(m[1][my][mx] != INF) continue; qt.push(1); m[1][my][mx] = m[t][y][x] + 1; } qbt.push(t); qx.push(mx); qy.push(my); } } } } cout << "-1" << endl; } int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> h >> w; rep(i,0,h) cin >> s[i]; solve(); return 0; }