314

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>

#define NORTH 0
#define EAST 1
#define SOUTH 2
#define WEST 3

using namespace std;

struct State{
	int x,y,dir;
	int val;
};

int r,c;
int gr[55][55][4];
string face;
int bx,by,ex,ey;

void bfs()
{
	int dir;
	queue<int> q;
	if(face=="south")
	dir=SOUTH;
	else if(face=="north")
	dir=NORTH;
	else if(face=="east")
	dir=EAST;
	else if(face=="west")
	dir=WEST;
	q.push(bx);q.push(by);q.push(dir);q.push(0);
	int x,y,d,v;
	while(!q.empty())
	{
		x = q.front();q.pop();
		y = q.front();q.pop();
		d = q.front();q.pop();
		v = q.front();q.pop();
		//cout<<x<<" "<<y<<"\n";
		gr[x][y][d]=1;
		if(ex==x && ey==y)
		{
			printf("%d\n",v);return;
		}
		if(d==NORTH)
		{
			if(gr[x][y][WEST]==0)
			{
				q.push(x);q.push(y);
				q.push(WEST);
				q.push(v+1);
			}
			if(gr[x][y][EAST]==0)
			{
				q.push(x);q.push(y);
				q.push(EAST);
				q.push(v+1);
			}

			if(x-1>0 && gr[x-1][y][d]==0)
			{
				q.push(x-1);q.push(y);q.push(d);
				q.push(v+1);
			}
			if(x-2>0 && gr[x-2][y][d]==0 && gr[x-1][y][d]==0)
			{
				q.push(x-2);q.push(y);q.push(d);
				q.push(v+1);
			}
			if(x-3>0 && gr[x-3][y][d]==0 && gr[x-2][y][d]==0 && gr[x-1][y][d]==0)
			{
				q.push(x-3);q.push(y);q.push(d);
				q.push(v+1);
			}
		}
		else if(d==EAST)
		{
			if(gr[x][y][NORTH]==0)
			{
				q.push(x);q.push(y);
				q.push(NORTH);
				q.push(v+1);
			}
			if(gr[x][y][SOUTH]==0)
			{
				q.push(x);q.push(y);
				q.push(SOUTH);
				q.push(v+1);
			}

			if(y+1<c && gr[x][y+1][d]==0)
			{
				q.push(x);q.push(y+1);q.push(d);
				q.push(v+1);
			}
			if(y+2<c && gr[x][y+2][d]==0 && gr[x][y+1][d]==0)
			{
				q.push(x);q.push(y+2);q.push(d);
				q.push(v+1);
			}
			if(y+3<c && gr[x][y+3][d]==0 && gr[x][y+2][d]==0 && gr[x][y+1][d]==0)
			{
				q.push(x);q.push(y+3);q.push(d);
				q.push(v+1);
			}
		}
		else if(d==WEST)
		{
			if(gr[x][y][NORTH]==0)
			{
				q.push(x);q.push(y);
				q.push(NORTH);
				q.push(v+1);
			}
			if(gr[x][y][SOUTH]==0)
			{
				q.push(x);q.push(y);
				q.push(SOUTH);
				q.push(v+1);
			}

			if(y-1>0 && gr[x][y-1][d]==0)
			{
				q.push(x);q.push(y-1);q.push(d);
				q.push(v+1);
			}
			if(y-2>0 && gr[x][y-2][d]==0 && gr[x][y-1][d]==0)
			{
				q.push(x);q.push(y-2);q.push(d);
				q.push(v+1);
			}
			if(y-3>0 && gr[x][y-3][d]==0 && gr[x][y-2][d]==0 && gr[x][y-1][d]==0)
			{
				q.push(x);q.push(y-3);q.push(d);
				q.push(v+1);
			}
		}
		else if(d==SOUTH)
		{
			if(gr[x][y][WEST]==0)
			{
				q.push(x);q.push(y);
				q.push(WEST);
				q.push(v+1);
			}
			if(gr[x][y][EAST]==0)
			{
				q.push(x);q.push(y);
				q.push(EAST);
				q.push(v+1);
			}

			if(x+1<r && gr[x+1][y][d]==0)
			{
				q.push(x+1);q.push(y);q.push(d);
				q.push(v+1);
			}
			if(x+2<r && gr[x+2][y][d]==0 && gr[x+1][y][d]==0)
			{
				q.push(x+2);q.push(y);q.push(d);
				q.push(v+1);
			}
			if(x+3<r && gr[x+3][y][d]==0 && gr[x+2][y][d]==0 && gr[x+1][y][d]==0)
			{
				q.push(x+3);q.push(y);q.push(d);
				q.push(v+1);
			}
		}


	}
	printf("-1\n");return;
}

int main()
{
	int a;
	while(scanf("%d%d",&r,&c))
	{
		if(r+c==0)
		break;
		memset(gr,0,sizeof(gr));

		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
				{
					scanf("%d",&a);
					if(a)
					{
						for(int k=0;k<4;k++)
						{
							gr[i][j][k]=a;gr[i+1][j+1][k]=a;
							gr[i+1][j][k]=a;gr[i][j+1][k]=a;
						}
					}
				}
		}
		scanf("%d%d%d%d",&bx,&by,&ex,&ey);
		cin>>face;
		bfs();
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *