#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[55][55];
int step[55][55];
bool f[55][55][28];
int sx,sy,fx,fy;
char sd;
struct thr
{
int first;
int second;
char de;
};
thr make_thr(int a,int b,char c)
{
thr x={a,b,c};
return x;
}
queue<thr>q;
void cz3(int&x,int&y,char&d){
if(d=='E')
d='N';
if(d=='S')
d='E';
if(d=='W')
d='S';
if(d=='N')
d='W';
}
void cz4(int&x,int&y,char&d){
if(d=='E')
d='S';
else if(d=='S')
d='W';
else if(d=='W')
d='N';
else if(d=='N')
d='E';
}
void cz0(int&x,int&y,char&d)
{
if(d=='E')
y++;
else if(d=='S')
x++;
else if(d=='W')
y--;
else if(d=='N')
x--;
}
void cz1(int&x,int&y,char&d){
if(d=='E')
y+=2;
if(d=='S')
x+=2;
if(d=='W')
y-=2;
if(d=='N')
x-=2;
}
void cz2(int&x,int&y,char&d){
if(d=='E')
y+=3;
if(d=='S')
x+=3;
if(d=='W')
y-=3;
if(d=='N')
x-=3;
}
void bfs()
{
q.push(make_thr(sx,sy,sd));
f[sx][sy][(sd-'A')]=1;
step[sx][sy]=0;
while(!q.empty())
{
int x=q.front().first;
int y=q.front().second;
int d=q.front().de;
q.pop();
for(int i=0;i<=4;i++)
{
int xx=x;
int yy=y;
char dd=d;
switch(i)
{
case 0:
cz3(xx,yy,dd);
break;
case 1:
cz4(xx,yy,dd);
break;
case 2:
cz0(xx,yy,dd);
break;
case 3:
cz1(xx,yy,dd);
break;
case 4:
cz2(xx,yy,dd);
break;
}
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&f[xx][yy][(dd-'A')]==0)
{
if(a[xx][yy]==1)
break;
q.push(make_thr(xx,yy,dd));
f[xx][yy][(dd-'A')]=1;
step[xx][yy]=step[x][y]+1;
if(xx==fx&&yy==fy)
return;
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),
step[i][j]=-1;
scanf("%d%d%d%d%c",&sx,&sy,&fx,&fy,&sd);
if(sx==fx&&sy==fy)
{
printf("0");
return 0;
}
bfs();
printf("%d",step[fx][fy]);
return 0;
}
原代码提交的 30 分记录