#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,d;//x,y是坐标,d是方向 
};//d=0代表上下方向,d=1是左右方向 
char a[1005][1005];
int step[1005][1005][2];
//step[x][y][0]代表头朝上下走到这个点所花的最小步数 
//step[x][y][1]代表头朝左右走到这个点的最小步数
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m,sx,sy,gx,gy; 
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='S') sx=i,sy=j;
			if(a[i][j]=='G') gx=i,gy=j;
		}
	}
	queue<node> q;
	//memset(step,0x3f,sizeof(step));
	q.push({sx,sy,0});
	q.push({sx,sy,1});
	while(!q.empty()){
		int x = q.front().x;
		int y = q.front().y;
		int d = q.front().d;//1
		if(x==gx && y==gy){
			cout<<step[x][y][d];
			return 0;
		}
		q.pop();
		if(d==0){
			for(int i=2;i<=3;i++){
				int tx = x+dx[i];
				int ty = y+dy[i];
				if(tx>=1 && tx<=n && ty>=1 && ty<=m && a[tx][ty]!='#' && step[tx][ty][1]==0){
					step[tx][ty][1]=step[x][y][0]+1;
					q.push({tx,ty,1});
				}
			}
		}
		else{
			for(int i=0;i<=1;i++){
				int tx = x+dx[i];
				int ty = y+dy[i];
				if(tx>=1 && tx<=n && ty>=1 && ty<=m && a[tx][ty]!='#' && step[tx][ty][0]==0){
					step[tx][ty][0]=step[x][y][1]+1;
					q.push({tx,ty,0});
				}
			}
		}
	}
	cout<<-1;
	return 0;
}

2 条评论

  • 1