633

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

using namespace std;

int stx,sty,edx,edy;
int gr[405][405];
int dirx[8]={-2,-2,2,2,1,1,-1,-1};
int diry[8]={1,-1,1,-1,2,-2,2,-2};
int dx[4]={2,2,-2,-2};
int dy[4]={-2,2,2,-2};
int n;

int bfs()
{
	queue<int> q;
	int x,y;
	//int visit[405][405];
	//memset(visit,0,sizeof(visit));
	int moveTyp=0,move;
	int step=0,stepCount;
	q.push(stx);q.push(sty);q.push(moveTyp);q.push(step);
	if(gr[stx][sty]==1)
	return -1;
	else if(gr[edx][edy]==1)
	return -1;

	while(!q.empty())
	{
		x = q.front();q.pop();
		y = q.front();q.pop();
		moveTyp = q.front();q.pop();
		stepCount = q.front();q.pop();
		gr[x][y]=1;
		if(x==edx && y==edy)
		{
			return stepCount;
		}
		if(moveTyp==0)
		{
			//move=1;//regular move
			for(int i=0;i<8;i++)
			{
				if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0)
				{
					q.push(x+dirx[i]);
					q.push(y+diry[i]);
					q.push(1);
					q.push(stepCount+1);
				}
			}
			//move=2//bishop
			for(int i=0;i<4;i++)
			{
				if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0)
				{
					q.push(x+dx[i]);
					q.push(y+dy[i]);
					q.push(2);
					q.push(stepCount+1);
				}
			}
			//move=3//teleportation
			if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0)
			{
				q.push(2*n-x+1);
				q.push(y);
				q.push(3);
				q.push(stepCount+1);
			}
			if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0)
			{
				q.push(x);
				q.push(2*n-y+1);
				q.push(3);
				q.push(stepCount+1);
			}
		}
		else if(moveTyp==1)
		{
			//move=2//bishop
			for(int i=0;i<4;i++)
			{
				if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0)
				{
					q.push(x+dx[i]);
					q.push(y+dy[i]);
					q.push(2);
					q.push(stepCount+1);
				}
			}
			//move=3//teleportation
			if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0)
			{
				q.push(2*n-x+1);
				q.push(y);
				q.push(3);
				q.push(stepCount+1);
			}
			if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0)
			{
				q.push(x);
				q.push(2*n-y+1);
				q.push(3);
				q.push(stepCount+1);
			}
		}
		else if(moveTyp==2)
		{
			//move=3//teleportation
			if(2*n-x+1>=1 && 2*n-x+1<=2*n && gr[2*n-x+1][y]==0)
			{
				q.push(2*n-x+1);
				q.push(y);
				q.push(3);
				q.push(stepCount+1);
			}
			if(2*n-y+1>=1 && 2*n-y+1<=2*n && gr[x][2*n-y+1]==0)
			{
				q.push(x);
				q.push(2*n-y+1);
				q.push(3);
				q.push(stepCount+1);
			}
			//move=1;//regular move
			for(int i=0;i<8;i++)
			{
				if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0)
				{
					q.push(x+dirx[i]);
					q.push(y+diry[i]);
					q.push(1);
					q.push(stepCount+1);
				}
			}
		}
		else if(moveTyp==3)
		{
			//move=1;//regular move
			for(int i=0;i<8;i++)
			{
				if(x+dirx[i]>=1 && x+dirx[i]<=2*n && y+diry[i]>=1 && y+diry[i]<=2*n && gr[x+dirx[i]][y+diry[i]]==0)
				{
					q.push(x+dirx[i]);
					q.push(y+diry[i]);
					q.push(1);
					q.push(stepCount+1);
				}
			}
			//move=2//bishop
			for(int i=0;i<4;i++)
			{
				if(x+dx[i]>=1 && x+dx[i]<=2*n && y+dy[i]>=1 && y+dy[i]<=2*n && gr[x+dx[i]][y+dy[i]]==0)
				{
					q.push(x+dx[i]);
					q.push(y+dy[i]);
					q.push(2);
					q.push(stepCount+1);
				}
			}
		}
	}
	return -1;
}
int main()
{
	int a,b;
	while(scanf("%d",&n),n)
	{
		scanf("%d%d",&stx,&sty);
		scanf("%d%d",&edx,&edy);
		memset(gr,0,sizeof(gr));
		while(scanf("%d%d",&a,&b),a,b)
		{
			gr[a][b]=1;
		}
		int ret = bfs();
		if(ret==-1)
		{
			printf("Solution doesn't exist\n");
		}
		else
		printf("Result : %d\n",ret);
	}
	return 0;
}

 

Leave a Reply

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