#include<bits/stdc++.h>
using namespace std;
const int INF=1000000000;
int a[55][55]={};
int sx,sy,ex,ey;
int n,m;
int mincnt=INF;
int vis[100][100];
map<char,int> mp;
struct Node{
int xx,yy,dir,step;
};
void bfs(Node st){
queue<Node> q;
q.push(st);
while(!q.empty()){
Node now=q.front();
if(now.xx==ex&&now.yy==ey&&(mincnt>now.step)) mincnt=now.step;
q.pop();
for(int i=1;i<=4;i++){//枚举,把可以走的方向push进去
int stp=now.step;
if(i!=now.dir){
if((i==1&&(now.dir==4||now.dir==2))||(i==2&&(now.dir==1||now.dir==3))||(i==3&&(now.dir==4||now.dir==2))||(i==4&&(now.dir==3||now.dir==1))){
stp=now.step+1;
}else if((i==1&&now.dir==3)||(i==2&&now.dir==4)||(i==3&&now.dir==1)||(i==4&&now.dir==2)){
stp=now.step+2;
}
}
for(int j=1;j<=3;j++){
Node temp;
if(i==1) temp.xx=now.xx,temp.yy=now.yy+j;
if(i==2) temp.xx=now.xx+j,temp.yy=now.yy;
if(i==3) temp.xx=now.xx,temp.yy=now.yy-j;
if(i==4) temp.xx=now.xx-j,temp.yy=now.yy;
if(temp.xx<1||temp.xx>=n||temp.yy>=m||temp.yy<1||a[temp.xx][temp.yy]==1) break;
if(vis[temp.xx][temp.yy]>stp){
temp.step=stp+1;
temp.dir=i;
q.push(temp);
vis[temp.xx][temp.yy]=stp;
}
}
}
}
}
int main()
{
freopen("in.txt","r",stdin);
cin>>n>>m;
mp['E']=1;mp['S']=2;mp['W']=3;mp['N']=4;
fill(vis[0],vis[0]+100*100,INF);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int temp;
cin>>temp;
if(temp>0)
a[i][j]=a[i-1][j-1]=a[i-1][j]=a[i][j-1]=temp;
}
}
for(int i=0;i<=n;i++){
a[i][0]=1;
a[i][m]=1;
}
for(int i=0;i<=m;i++){
a[0][i]=1;
a[n][i]=1;
}
char d;
scanf("%d %d %d %d %c",&sx,&sy,&ex,&ey,&d);
Node t;int dd=mp[d];
t.dir=dd;t.step=0;t.xx=sx;t.yy=sy;
bfs(t);
if(mincnt>=INF)
cout<<-1;
else cout<<mincnt;
return 0;
}
注意往东纵坐标加,往西减,往南加,往北减(LZ就是卡在这里。。。)
再一个点,这里只能用vis二维数组记录起点到每个点的最短距离,不然麻烦很大。。。。