游客 Signup | Login
中文 | En

3711 - 追牛

通过次数

0

提交次数

0

Time Limit : 1 秒 Memory Limit : 128 MB

两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。

追击在10x10的平面网格内进行。一个格子可以是:

 一个障碍物, 

 两头牛(它们总在一起), 或者 
 农民John. 

<span style="font-size:16px;">两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。</span>

<span style="font-size:16px;">一个格子可以是:</span>

<span style="font-size:16px;">&nbsp;. 空地&nbsp; </span><br />

 * 障碍物 
 C 两头牛 
 F 农民John 
 这里有一个地图的例子::

<span style="font-size:16px;">*...*.....</span><br />

.........
........
..........
....F....
........
.........
..C......
........
........
 

<span style="font-size:16px;">牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。</span>

<span style="font-size:16px;">农民John, 深知牛的移动方法,他也这么移动。</span>

<span style="font-size:16px;">每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。</span>

Input

Lines 1-10:
 每行10个字符,表示如上文描述的地图。

Output

输出一个数字,表示John需要多少时间才能抓住牛们。输出0,如果John无法抓住牛。

Examples

Input Format

*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......

Output Format

49

Solution C

#include<stdio.h>
#include<string.h>
int main()
{
	int i1,i2,j1,j2,i,x[12][12]={0},k=1,m=0,n=0,sum=0;
	char c[12];
	for(i=0;i<=11;i++)
		x[i][0]=x[0][i]=x[11][i]=x[i][11]=1;
	while(scanf("%s",c)==1&&strlen(c)>5)
	{
		for(i=0;i<10;i++)
		{
			if(c[i]=='*')x[k][i+1]=1;
			else if(c[i]=='C'){x[k][i+1]=0;i1=k;i2=i+1;}
			else if(c[i]=='F'){x[k][i+1]=0;j1=k;j2=i+1;}
		}
		k++;
		if(k==11){
			while(i1!=j1||i2!=j2)
			{
				if(m==0)if(x[i1-1][i2]==1)m=1;else i1--;
				else if(m==1)if(x[i1][i2+1]==1)m=2;else i2++;
				else if(m==2)if(x[i1+1][i2]==1)m=3;else i1++;
				else if(m==3)if(x[i1][i2-1]==1)m=0;else i2--;
				if(n==0)if(x[j1-1][j2]==1)n=1;else j1--;
				else if(n==1)if(x[j1][j2+1]==1)n=2;else j2++;
				else if(n==2)if(x[j1+1][j2]==1)n=3;else j1++;
				else if(n==3)if(x[j1][j2-1]==1)n=0;else j2--;
				sum++;
				if(sum>10000)break;
			}
			if(sum<10000)printf("%d\n",sum);else printf("0\n");
			memset(x,0,sizeof(x));k=1;m=0;n=0;
			for(i=0;i<=11;i++)
				x[i][0]=x[0][i]=x[11][i]=x[i][11]=1;
			sum=0;
		}
	}
	return 1;
}

Solution C++

#include<stdio.h>
struct node
{
	int x,y;
	int move;
};
char a[10][10];
void move(node& animal)
{
	switch (animal.move)
	{
	case 0:
		{
			if (animal.x==0||a[animal.x-1][animal.y]=='*')
				animal.move=(animal.move+1)%4;
			else animal.x--;
			break;
		}
		case 1:
		{
			if (animal.y==9||a[animal.x][animal.y+1]=='*')
				animal.move=(animal.move+1)%4;
			else animal.y++;
			break;
		}
		case 2:
		{
			if (animal.x==9||a[animal.x+1][animal.y]=='*')
				animal.move=(animal.move+1)%4;
			else animal.x++;
			break;
		}
		case 3:
		{
			if (animal.y==0||a[animal.x][animal.y-1]=='*')
				animal.move=(animal.move+1)%4;
			else animal.y--;
			break;
		}
	}
}
int main()
{
	while(scanf("%s",a[0])!=EOF)
	{
		for (int i=1;i<10;i++) scanf("%s",a[i]);
		node people,niu;
		int x,y,x1,y1;
		for (int i=0;i<10;i++)
			for (int j=0;j<10;j++)
			{
				if (a[i][j]=='C') {x=niu.x=i;y=niu.y=j;niu.move=0;}
				if (a[i][j]=='F') {x1=people.x=i;y1=people.y=j;people.move=0;}
			}
			int all=0;
			int ok=0;
			while(niu.x!=people.x||niu.y!=people.y)
			{
				all++;
				move(niu);
				move(people);
				if (all>=160000) {printf("0\n");ok=1;break;}
			}
			if (!ok)
			printf("%d\n",all);
	}
	return 0;
}