#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long; using ull = unsigned long long; using ld = long double; using pii = array; using pll = array; #define vall(A) A.begin(), A.end() #define vin(A) for (int iiii = 0, sz = A.size(); iiii < sz; iiii++){cin >> A[iiii];} #define vout(A) for (int iiii = 0, sz = A.size(); iiii < sz; iiii++){cout << A[iiii] << " \n"[iiii == sz-1];} #define vout2d(A) for (int iiii = 0, HHHH = A.size(), WWWW = (A.empty() ? 0 : A[0].size()); iiii < HHHH; iiii++){for (int jjjj = 0; jjjj < WWWW; jjjj++){cout << A[iiii][jjjj] << " \n"[jjjj==WWWW-1];}} #define adjvin(A) for (int iiii = 1, sz = A.size(); iiii < sz; iiii++){cin >> A[iiii];} #define adjvout(A) for (int iiii = 1, sz = A.size(); iiii < sz; iiii++){cout << A[iiii] << " \n"[iiii == sz-1];} #define adjvout2d(A) for (int iiii = 1, HHHH = A.size(), WWWW = (A.empty() ? 0 : A[0].size()); iiii < HHHH; iiii++){for (int jjjj = 1; jjjj < WWWW; jjjj++){cout << A[iiii][jjjj] << " \n"[jjjj==WWWW-1];}} #define btest(K,i) (((K)&(1ull<<(i))) != 0) template void print(T object){cout << (object) << "\n";} template void print(T object1, U object2){cout << (object1) << " " << (object2) << "\n";} template void print(T object1, U object2, V object3){cout << (object1) << " " << (object2) << " " << (object3) << "\n";} vector pow2ll{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976,2305843009213693952,4611686018427387904, 9223372036854775808ull}; vector pow10ll{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000, 10000000000000000000ull}; vector di{0,1,0,-1}; vector dj{1,0,-1,0}; void solve(){ ll H,W; cin >> H >> W; vector> A(2*H+1, vector(2*W+1, ".")); for (ll i = 1; i <= H; i++){ string T; cin >> T; for (ll j = 1; j <= W; j++){ auto s = string{T[j-1]}; if (s == "S" or s == "G"){ s = "."; } A[2*i-1][2*j-1] = s; } } vector> D(2*H+1, vector(2*W+1, -1)); D[1][1] = 0; queue Q; Q.push({1,1}); auto gridvalid = [](const ll &i, const ll &j, const ll &H, const ll &W){ return i >= 0 && j >= 0 && i <= 2*H-1; j <= 2*W-1; }; while (!Q.empty()){ auto now = Q.front(); Q.pop(); vector adj{{0,1},{1,0},{0,-1},{-1,0}}; if (now[0]%2){ adj.push_back({2,0}); adj.push_back({-2,0}); } if (now[1]%2){ adj.push_back({0,2}); adj.push_back({0,-2}); } for (auto& t : adj){ if (gridvalid(now[0]+t[0], now[1]+t[1], H, W) && D[now[0]+t[0]][now[1]+t[1]] == -1 && A[now[0]+t[0]][now[1]+t[1]] == "."){ D[now[0]+t[0]][now[1]+t[1]] = D[now[0]][now[1]]+1; Q.push({now[0]+t[0], now[1]+t[1]}); } } } print(D[2*H-1][2*W-1]); } int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); ll T = 1; //cin >> T; while (T--){ solve(); } }