代码
#include<iostream>
#include<queue>
using namespace std;
queue<int>q1,q2,q3;
bool vis[10][55][55];
bool a[55][55];
int dis[10][55][55],n,m,qidianx,qidiany,zhongdianx,zhongdiany,fang;
int bfs()
{
q1.push(qidianx);
q2.push(qidiany);
q3.push(fang);
vis[fang][qidianx][qidiany]=1;
while(!q1.empty())
{
int x,y,f;
x=q1.front();
y=q2.front();
f=q3.front();
q1.pop();
q2.pop();
q3.pop();
if(x==zhongdianx&&y==zhongdiany)
{
return dis[f][x][y];
}
int xx,yy,fx;
fx=f+1;
xx=x;
yy=y;
if(fx>4)fx=1;
if(!vis[fx][xx][yy])
{
vis[fx][xx][yy]=1;
dis[fx][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(fx);
}
fx=f-1;
xx=x;
yy=y;
if(fx<1)fx=4;
if(!vis[fx][xx][yy])
{
vis[fx][xx][yy]=1;
dis[fx][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(fx);
}
if(f==1)
{
xx=x-1;
yy=y;
if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x-2;
yy=y;
if(a[xx][yy]==0&&a[xx+1][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x-3;
yy=y;
if(a[xx][yy]==0&&a[xx+1][yy]==0
&&a[xx+2][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
}
if(f==2)
{
xx=x;
yy=y+1;
if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x;
yy=y+2;
if(a[xx][yy]==0&&a[xx][yy-1]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x;
yy=y+3;
if(a[xx][yy]==0&&a[xx][yy-1]==0
&&a[xx][yy-2]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
}
if(f==3)
{
xx=x+1;
yy=y;
if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x+2;
yy=y;
if(a[xx][yy]==0&&a[xx-1][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x+3;
yy=y;
if(a[xx][yy]==0&&a[xx-1][yy]==0
&&a[xx-2][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
}
if(f==4)
{
xx=x;
yy=y-1;
if(a[xx][yy]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x;
yy=y-2;
if(a[xx][yy]==0&&a[xx][yy+1]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
xx=x;
yy=y-3;
if(a[xx][yy]==0&&a[xx][yy+1]==0
&&a[xx][yy+2]==0&&xx>=1&&yy>=1&&xx<=n-1&&yy<=m-1&&vis[f][xx][yy]==0)
{
vis[f][xx][yy]=1;
dis[f][xx][yy]=dis[f][x][y]+1;
q1.push(xx);
q2.push(yy);
q3.push(f);
}
}
}
return -1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int k;
cin>>k;
if(k==1)
{
a[i-1][j-1]=1;
a[i-1][j]=1;
a[i][j-1]=1;
a[i][j]=1;
}
}
}
n--;
m--;
cin>>qidianx>>qidiany>>zhongdianx>>zhongdiany>>fang;
if(fang=='N')fang=4;
else if(fang=='S')fang=2;
else if(fang=='E')fang=3;
else if(fang=='W')fang=1;
cout<<bfs()<<endl;
return 0;
}