两只塔姆沃斯牛(模拟)

题目描述

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

这里有一个地图的例子::

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

 

输入

Lines 1-10:

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

 

输出

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

 

样例输入

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

 

样例输出

49

 题意描述:农夫和牛都在地图的不同位置。他们遵循着不撞墙不转弯的行走规则(并且转弯也只往右转),现在在10*10的迷宫里,想要知道,他们都按照规则走路。多少步才能碰到彼此。并且,相互穿过去,不算相遇。只有在某个时间点他俩在同一点才算相遇。输出所需时间。

解题思路:就是模拟模拟模拟模拟模拟模拟(这里没有问题,就是说了3遍)。太多细节需要考虑,有点浪费时间,只要一步一步的解决,其实题目不是很难。就是麻烦麻烦麻烦。思路在代码里面也很详细了,就不多说了

AC代码

#include<stdio.h>
int dx[]={0,1,0,-1},
	dy[]={1,0,-1,0};		//定义方向 
int t1=3,t2=3,T1=0,T2=0;	//初始化方向和转向状态 
int time=0;
char map[11][11];

int main(){
	int i,j,k,m,n,x1,y1,x2,y2;
	for(i=0;i<10;i++)
		scanf(" %s",map[i]);	//输入字符串 
	for(i=0;i<10;i++)
		for(j=0;j<10;j++)		//找出牛和农夫的位置,C和F 
		{
			if(map[i][j]=='C'){
				x1=i;y1=j;
			}
			if(map[i][j]=='F'){
				x2=i;y2=j;
			}
		}
	while(1)					//设置死循环,使两者两者相等时结束。 
	{
		if(x1==x2 && y1==y2){
			printf("%d\n",time);
			break;
		}
		else if(time>=10000){	//10*10的地图,即便每圈接近一步,最多10000步就可以追上,还追不上就代表永远追不上了 
			printf("0\n");break;
		}
		if(x1+dx[t1]<0 || x1+dx[t1]>9 || y1+dy[t1]<0 || y1+dy[t1]>9 || map[x1+dx[t1]][y1+dy[t1]]=='*') T1=0;		//查看x1和y1的位置,看是否需要转向 
		if(x2+dx[t2]<0 || x2+dx[t2]>9 || y2+dy[t2]<0 || y2+dy[t2]>9 || map[x2+dx[t2]][y2+dy[t2]]=='*') T2=0;		//同上 
//		下面是4种情况,分别代表两个物体的转向状态。
//		if——if 两个都转向 
//		if——else x1,y1转向,x2,y2不转向
//		else——if x1,y1不转向,x2,y2转向
//		else——else 两个都不转向 
		if((x1+dx[t1]<0 || x1+dx[t1]>9 || y1+dy[t1]<0 || y1+dy[t1]>9 || map[x1+dx[t1]][y1+dy[t1]]=='*') && T1==0){
			t1=(t1+1)%4;T1=1;				//x1,y1转向,并回复状态 
			if((x2+dx[t2]<0 || x2+dx[t2]>9 || y2+dy[t2]<0 || y2+dy[t2]>9 || map[x2+dx[t2]][y2+dy[t2]]=='*') && T2==0){
				t2=(t2+1)%4;T2=1;
				time++;						//都转 
			}
			else{
				time++; T2=0; x2+=dx[t2]; y2+=dy[t2];//1转,2不转 
			}
		}
		else{
			if((x2+dx[t2]<0 || x2+dx[t2]>9 || y2+dy[t2]<0 || y2+dy[t2]>9 || map[x2+dx[t2]][y2+dy[t2]]=='*') && T2==0){
				t2=(t2+1)%4; T2=1;//printf("%d %d %d * \n",t2,dx[t2],dy[t2]);
				time++; T1=0; x1+=dx[t1]; y1+=dy[t1];//1不转,2转 
				}
			else{
				time++; T1=0; T2=0;x1+=dx[t1];y1+=dy[t1];x2+=dx[t2];y2+=dy[t2];//都不转 
			}
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BayMin0520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值