需要注意一下几点:
1.每次只能转九十度
2. 不能走边界
3.边界需要特判
4.终点可能不能到达
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
int dir[4][2]= {0 , 1 ,1 , 0 , 0 , -1 , -1 , 0};
char direct[4][10]= {"east" , "south", "west" , "north"};
int Map[55][55];
int visit[55][55][4];
int m,n;
int sx,sy,ex,ey;
int sum;
struct node
{
int x;
int y;
int dir;
int step;
};
int Find(char *a)
{
for(int i = 0 ; i < 4 ; i ++ )
{
if(strcmp(a , direct[i]) == 0)
{
return i;
}
}
return -1;
}
void BFS(char *a)
{
node temp;
temp.dir = Find(a);
temp.x = sx;
temp.y = sy;
temp.step = 0;
visit[sx][sy][temp.dir] = 1;
queue <node>Q;
Q.push(temp);
while(!Q.empty())
{
temp = Q.front();
Q.pop();
if(temp.x == ex && temp.y == ey)
{
sum = temp.step;
while(!Q.empty()) Q.pop();
break;
}
for(int i = 1 ; i <= 3 ; i ++ )
{
node cur;
cur.x = temp.x + i * dir[temp.dir][0];
cur.y = temp.y + i * dir[temp.dir][1];
cur.dir = temp.dir;
cur.step = temp.step + 1;
if(cur.x < m && cur.x > 0 && cur.y < n && cur.y > 0 && !visit[cur.x][cur.y][cur.dir])
{
if(cur.dir == 0)
{
if(Map[cur.x][cur.y] == 1 || Map[cur.x - 1][cur.y] == 1) break;
}
else if(cur.dir == 1)
{
if(Map[cur.x][cur.y] == 1 || Map[cur.x][cur.y - 1] == 1) break;
}
else if(cur.dir == 2)
{
if(Map[cur.x][cur.y - 1] == 1 || Map[cur.x - 1][cur.y - 1] == 1) break;
}
else
{
if(Map[cur.x - 1][cur.y] == 1 || Map[cur.x - 1][cur.y - 1] == 1) break;
}
visit[cur.x][cur.y][cur.dir] = 1;
Q.push(cur);
}
}
node cur;
cur.x = temp.x;
cur.y = temp.y;
cur.dir = (temp.dir + 1 ) % 4;
cur.step = temp.step + 1;
if(!visit[cur.x][cur.y][cur.dir])
{
Q.push(cur);
visit[cur.x][cur.y][cur.dir] = 1;
}
cur.dir = ( (temp.dir - 1) % 4 + 4) % 4;
if(!visit[cur.x][cur.y][cur.dir])
{
Q.push(cur);
visit[cur.x][cur.y][cur.dir] = 1;
}
}
return ;
}
int main()
{
while(scanf("%d%d", &m ,&n) != EOF && (m || n))
{
for(int i = 0 ; i < m ; i ++ )
{
for(int j = 0 ; j < n ; j ++ )
{
scanf("%d", &Map[i][j]);
}
}
scanf("%d%d", &sx ,&sy);
scanf("%d%d", &ex ,&ey);
char a[10];
cin >> a ;
if(sx < 1 || sx > m - 1 || ex < 1 || ex > m - 1 || sy < 1 || sy > n - 1 || ey < 1 || ey > n - 1)
{
printf("-1\n");
continue;
}
if(Map[ex][ey] == 1 || Map[ex - 1][ey] == 1 || Map[ex - 1][ey - 1] == 1 || Map[ex][ey - 1] == 1)
{
printf("-1\n");
continue;
}
if(Map[sx][sy] == 1 || Map[sx - 1][sy] == 1 || Map[sx - 1][sy - 1] == 1 || Map[sx][sy - 1] == 1)
{
printf("-1\n");
continue;
}
sum = -1;
memset(visit , 0 , sizeof(visit));
BFS(a);
printf("%d\n" , sum);
}
return 0;
}