【USACO题库】2.4.1 The Tamworth Two两只塔姆沃斯牛

【USACO题库】2.4.1 The Tamworth Two两只塔姆沃斯牛

(File IO): input:ttwo.in output:ttwo.out

题目描述

两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物,两头牛(它们总在一起), 或者农民John.

两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。一个格子可以是:

. 空地
* 障碍物
C 两头牛
F 农民John
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......

牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。

输入

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

输出

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

样例输入

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

样例输出

49

数据范围限制

这是一道纯粹的农夫抓奶牛(老鹰抓小鸡)模拟题,时间复杂度为O(104×42)。用一个while循环160000+1次,如果农夫和奶牛可以往前走,那就走,否则就转弯。如果while结束了,农夫还没有抓到奶牛,输出0。这个160000是有依据的,地图总共有100个格子,农夫和奶牛总共有4个方向,所以,农夫在地图里,总共最多会有400种情况,也就是说,农夫最多行驶400分钟,就必定会返回到起始或路途中经过的地方,且方向相同。奶牛也是如此。所以奶牛和农夫在地图里就一共最多会有400×400,160000种情况(虽然事实没有那么多)。我看到许多同学在while里面都只写了10000、20000等,数值都非常小,这是极其危险的,万一出题者给我们出了些特殊情况?

#include<cstdio>
int n=10,a[12][12],x[3],y[3],z,f[3]={
    
    0,1,1};//初始化奶牛和农夫的方向为北
const int dx[5]={
    
    0,-1,0,1,0};//方向,分别是北、东、南、西
const int dy[5]={
    
    0,0,1,0,-1};
char c;
int main()
{
    
    
	freopen("ttwo.in","r",stdin);
	freopen("ttwo.out","w",stdout);
	for(int i=1;i<=n;++i)//n为地图的长与宽,10
	{
    
    
		for(int j=1;j<=n;++j)
		{
    
    
			scanf("%c",&c);//输入
			if(c=='*')
				a[i][j]=1;
			if(c=='F')
			{
    
    
				x[1]=i;//农夫坐标
				y[1]=j;
			}
			if(c=='C')
			{
    
    
				x[2]=i;//奶牛坐标
				y[2]=j;
			}
	
		scanf("\n");//如果用我这种方法读入,不要忘了\n
	}
	//读入完之后如果程序还在等待,记得按Ctrl+Z
	while(z<=160001)
	{
    
    
		for(int i=1;i<=2;++i)
		{
    
    
			int xx=x[i]+dx[f[i]];//求按原来方向往前走的坐标
			int yy=y[i]+dy[f[i]];
			if(a[xx][yy]==0&&xx>0&&yy>0&&xx<=n&&yy<=n)//没有障碍物且不出地图
			{
    
    
				x[i]=xx;//改变坐标(往前走)
				y[i]=yy;
			}
			else
				f[i]=f[i]%4+1;//改变方向
		}
		z++;//时间+1
		if(x[1]==x[2]&&y[1]==y[2])//相遇
		{
    
    
			printf("%d",z);
			return 0;
		}
	}
	printf("0");
	return 0;
}

农夫:cow(靠)!!!快回来!!!

新年好!祝大家牛年大吉!

猜你喜欢

转载自blog.csdn.net/Wu_tongchun/article/details/113786313