710

This is quite an easy problem. But it took me long time to realize that to determine the number of total game segments is nothing but counting the direction changes to reach the destination.

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

using namespace std;

int w,h;
int SEGMENT;
int gr[80][80];
int visit[80][80];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

int bfs(int stx,int sty,int edx,int edy)
{
	int x,y,stp;
	int direction=0,tmpDirection;
	int tmpx,tmpy;
	queue<int> q;
	memset(visit,0,sizeof(visit));
	int step=0;
	q.push(stx);
	q.push(sty);
	q.push(step);
	q.push(direction);

	while(!q.empty())
	{
		x = q.front();q.pop();
		y = q.front();q.pop();
		stp = q.front();q.pop();
		direction = q.front();q.pop();
		visit[x][y]=1;

		for(int i=0;i<4;i++)
		{
			if(x+dx[i]==edx && y+dy[i]==edy)
			{
				if(dx[i]==0)
					tmpDirection=1;//horizontal direction
				else if(dy[i]==0)
					tmpDirection=2;//vertical direction
				if(tmpDirection!=direction)
					return stp+1;
				return stp;
			}
			if(x+dx[i]>=0 && x+dx[i]<=(h+1) && y+dy[i]>=0 && y+dy[i]<=(w+1) && visit[x+dx[i]][y+dy[i]]==0 && gr[x+dx[i]][y+dy[i]]==0)
			{
				tmpx = x+dx[i];
				tmpy = y+dy[i];
				q.push(x+dx[i]);
				q.push(y+dy[i]);
				if(dx[i]==0)
					tmpDirection=1;//horizontal direction
				else if(dy[i]==0)
					tmpDirection=2;//vertical direction
				if(tmpDirection!=direction)
					q.push(stp+1);
				else if(tmpDirection==direction)
					q.push(stp);
				q.push(tmpDirection);
			}
		}
	}
	return -1;
}


int main()
{
	char ch;
	int kase=1;
	string str;
	vector<int> path;
	int x1,x2,y1,y2;
	while(scanf("%d%c%d%c",&w,&ch,&h,&ch),w,h)
	{
		memset(gr,0,sizeof(gr));
		for(int i=1;i<=h;i++)
		{
			getline(cin,str);
			for(int j=0;j<w;j++)
			{
				if(str[j]=='X')
				gr[i][j+1]=1;
				else if(str[j]==' ')
				gr[i][j+1]=0;
			}
		}
		bool flag=0;
		int ccase=1;
		int res;
		while(scanf("%d%c%d%c%d%c%d%c",&x1,&ch,&y1,&ch,&x2,&ch,&y2,&ch))
		{
			if(x1+y1+x2+y2==0)
			break;
			res = bfs(y1,x1,y2,x2);
			if(flag==0)
				printf("Board #%d:\n",kase++);
			flag = 1;
			if(res==-1)
			printf("Pair %d: impossible.\n",ccase++);
			else
			printf("Pair %d: %d segments.\n",ccase++,res);
		}
		printf("\n");
	}
	return 0;
}

 

Leave a Reply

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