这也是30分的,那里错了?
```cpp
#include<cstdio>
#include<queue>
using namespace std;
const int direction[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
const char EWSN[5]={'E','W','S','N'};
int n,m,sx,sy,ex,ey;
int map[100][100]={0};
bool gone[100][100]={0},condition[100][100][5]={0};
struct Robot
{
int x,y,direct,time;//0:east;1:west;2:south;3:north.
};
queue <Robot>Q;
int main()
{
scanf("%d%d",&n,&m);
for (register int i=1;i<=n;i++)
for (register int j=1;j<=m;j++)
{
int read1;
scanf("%d",&read1);
if (read1)
map[i][j]=map[i-1][j]=map[i][j-1]=map[i-1][j-1]=1;
}
char read;
scanf("%d%d%d%d %c",&sy,&sx,&ey,&ex,&read);
Robot start;
for (int i=0;i<4;i++)
if (read==EWSN[i])
start.direct=i;
start.time=0;
start.x=sx;
start.y=sy;
Q.push(start);
gone[sx][sy]=1;
condition[sx][sy][start.direct]=1;
while (!Q.empty())
{
Robot a=Q.front(),b;
Q.pop();
if (a.x==ex&&a.y==ey)
{
printf("%d",a.time);
return 0;
}
if (a.time>5000)
{
printf("-1");
return 0;
}
for (int r=1;r<=3;r++)
{
b.x=a.x+r*direction[a.direct][0];
b.y=a.y+r*direction[a.direct][1];
if(b.x<1||b.x>n&&b.y<1||b.y>m||map[b.x][b.y])
break;
if(!condition[b.x][b.y][a.direct])
{
b.direct=a.direct;
b.time=a.time+1;
condition[b.x][b.y][b.direct]=1;
Q.push(b);
}
}
switch (a.direct)
{
case 0:
case 1:
b.direct=2;
if(!condition[a.x][a.y][b.direct])
{
b.x=a.x;
b.y=a.y;
b.time=a.time+1;
condition[b.x][b.y][b.direct]=1;
Q.push(b);
}
b.direct=3;
if(!condition[a.x][a.y][b.direct])
{
b.x=a.x;
b.y=a.y;
b.time=a.time+1;
condition[b.x][b.y][b.direct]=1;
Q.push(b);
}
break;
case 2:
case 3:
b.direct=0;
if(!condition[a.x][a.y][b.direct])
{
b.x=a.x;
b.y=a.y;
b.time=a.time+1;
condition[a.x][a.y][b.direct]=1;
Q.push(b);
}
b.direct=1;
if(!condition[a.x][a.y][b.direct])
{
b.x=a.x;
b.y=a.y;
b.time=a.time+1;
condition[b.x][b.y][b.direct]=1;
Q.push(b);
}
break;
}
}
printf("-1");
return 0;
}
```
by jiande @ 2018-08-09 16:29:01