2.4.1 The Tamworth Two 两只塔姆沃斯牛

2.4.1 The Tamworth Two 两只塔姆沃斯牛

时间: 1ms        内存:64M

描述:

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

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

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

一个格子可以是:

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

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

牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。

农民John, 深知牛的移动方法,他也这么移动。

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

输入:

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

输出:

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

示例输入:

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

示例输出:

49

提示:

参考答案(内存最优[752]):

#include <stdio.h>

int disc,disf,cx,cy,fx,fy,sum;
int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//↑ → ↓ ←
char map[11][11];

int check(int a,int b){
	if(a>=0 && a<10 && b>=0 && b<10)
		return 1;
	return 0;
}

void solve(int ax,int ay,int bx,int by,int num){
	int x,y;
	if(sum)
		return ;
	if(num>160000){//终止条件
		if(ax!=bx || ay!=by)
			sum=-1;
		else
			sum=num;
		return ;//找不到 
	}
	if(ax==bx && ay==by){//找到
		sum=num;
		return ;
	}
	x=dis[disf][0];
	y=dis[disf][1];
	if(check(ax+x,ay+y) && map[ax+x][ay+y]!='*')
		ax+=x,ay+=y;
	else
		disf=(disf+1)%4;
	x=dis[disc][0];
	y=dis[disc][1];
	if(check(bx+x,by+y) && map[bx+x][by+y]!='*')
		bx+=x,by+=y;
	else
		disc=(disc+1)%4;
	solve(ax,ay,bx,by,num+1);
}

int main(){
	int i,j;
	sum=fx=fy=cx=cy=0;
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			scanf("%c",&map[i][j]);
			if(map[i][j]=='F')
				fx=i,fy=j;
			if(map[i][j]=='C')
				cx=i,cy=j;
		}
		getchar();
	}
	solve(fx,fy,cx,cy,0);
	printf("%d\n",sum==-1?0:sum);
	return 0;
}

参考答案(时间最优[5]):

#include <stdio.h>

int disc,disf,cx,cy,fx,fy,sum;
int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//↑ → ↓ ←
char map[11][11];

int check(int a,int b){
	if(a>=0 && a<10 && b>=0 && b<10)
		return 1;
	return 0;
}

void solve(int ax,int ay,int bx,int by,int num){
	int x,y;
	if(sum)
		return ;
	if(num>160000){//终止条件
		if(ax!=bx || ay!=by)
			sum=-1;
		else
			sum=num;
		return ;//找不到 
	}
	if(ax==bx && ay==by){//找到
		sum=num;
		return ;
	}
	x=dis[disf][0];
	y=dis[disf][1];
	if(check(ax+x,ay+y) && map[ax+x][ay+y]!='*')
		ax+=x,ay+=y;
	else
		disf=(disf+1)%4;
	x=dis[disc][0];
	y=dis[disc][1];
	if(check(bx+x,by+y) && map[bx+x][by+y]!='*')
		bx+=x,by+=y;
	else
		disc=(disc+1)%4;
	solve(ax,ay,bx,by,num+1);
}

int main(){
	int i,j;
	sum=fx=fy=cx=cy=0;
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			scanf("%c",&map[i][j]);
			if(map[i][j]=='F')
				fx=i,fy=j;
			if(map[i][j]=='C')
				cx=i,cy=j;
		}
		getchar();
	}
	solve(fx,fy,cx,cy,0);
	printf("%d\n",sum==-1?0:sum);
	return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注