AC x41
WA x16
#include<map>
#include<set>
#include<list>
#include<stack>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 1e3 + 10;
typedef unsigned int ui;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
const double PI = acos(-1.0);
typedef unsigned long long ull;
void print(int x){if(x<0){putchar('-');x=-x;}if(x>9){print(x/10);}putchar(char(x%10+'0'));}
inline int read() {int f=1,sum=0;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){sum=(sum<<1)+(sum<<3)+(ch^48);ch=getchar();}return sum*f;}
// ----------------------------
struct node {
int x,y,dir,step;
};
// ----------------------------
queue<node> q;
bool st[N][N];
char matrix[N][N];
int dx[5] = {-1,0,0,1};
int dy[5] = {0,-1,1,0};
// ----------------------------
int main() {
int h,w;
cin>>h>>w;
for (int i=1;i<=h;i++) {
for (int j=1;j<=w;j++) {
cin>>matrix[i][j];
if (matrix[i][j] == 'S') {
st[i][j] = true;
q.push({i,j,0,0});
}
}
}
// ------------------------
while (!q.empty()) {
node u = q.front();
q.pop();
for (int i=0;i<4;i++) {
int nx = u.x + dx[i];
int ny = u.y + dy[i];
if (nx>0 && nx<=h && ny>0 && ny<=w && !st[nx][ny] && matrix[nx][ny]!='#' && (dx[i]==0 && u.dir!=2 || dx[i]!=0 && u.dir!=1)) {
st[nx][ny] = true;
q.push({nx,ny,(dx[i]==0 ? 2 : 1),u.step+1});
if (matrix[nx][ny] == 'G') {
cout<<u.step+1;
return 0;
}
}
}
}
// ------------------------
cout<<-1;
return 0;
}