at提交记录
#include <bits/stdc++.h>
using namespace std;
const int N=1e3*2+10;
char mp[N][N];
bool vis[N][N];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0},n,m;
struct State{
int x;
int y;
int step;
};
int bfs(State st,int ex,int ey){
vis[st.x][st.y]=1;
State now,next;
queue<State> q;
st.step=0;
q.push(st);
while(!q.empty()){
now=q.front();
if(now.x==ex&&now.y==ey){
return now.step;
}
for(int i=0;i<4;i++){
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(next.x>=0&&next.x<n&&next.y>=0&&next.y<m&&vis[next.x][next.y]!=1&&mp[next.x][next.y]!='#'&&mp[next.x][next.y]!='v'&&mp[next.x][next.y]!='<'&&mp[next.x][next.y]!='>'&&mp[next.x][next.y]!='^'){
next.step=now.step+1;
vis[next.x][next.y]=1;
q.push(next);
}
}
q.pop();
}
return -1;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>mp[i][j];
}}
State temp;
int ex,ey;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='S')temp.x=i,temp.y=j;
if(mp[i][j]=='G')ex=i,ey=j;
if(mp[i][j]=='<'){
for(int k=j-1;k>=0;k--){
if(mp[i][k]=='#'||mp[i][k]=='>'||mp[i][k]=='v'||mp[i][k]=='^') break;
mp[i][k]='#';
}
}
if(mp[i][j]=='>'){
for(int k=j+1;k<m;k++){
if(mp[i][k]=='#'||mp[i][k]=='<'||mp[i][k]=='v'||mp[i][k]=='^') break;
mp[i][k]='#';
}
}
if(mp[i][j]=='v'){
for(int k=i+1;k<n;k++){
if(mp[k][j]=='#'||mp[k][j]=='^'||mp[k][j]=='>'||mp[k][j]=='<') break;
mp[k][j]='#';
}
}
if(mp[i][j]=='^'){
for(int k=i-1;k>=0;k--){
if(mp[k][j]=='#'||mp[k][j]=='^'||mp[k][j]=='>'||mp[k][j]=='<') break;
mp[k][j]='#';
}
}
}
}
cout<<bfs(temp,ex,ey);
return 0;
}