两只塔姆沃斯牛(模拟)

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




.F…


…C…

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

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

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

样例输入




.F…


…C…

.
..

样例输出
49

题意描述:

输入一个10*10的矩阵,.代表路,*代表障碍物,C和F分别代表牛和农夫john,牛开始向北行驶每走一步需要1分钟,然后碰见障碍物或者是墙就会向右转,转向也需要1分钟,农夫john和牛的走法相同,问农夫要用多长时间才能找到牛。如果一直都找不到就输出0。

解题思路:

其实本体第一眼看上去有点像是dfs,但其实是个模拟,你只需要去模拟牛和农夫john走的过程就可,看他们两个是否在某一时刻会出现在同一个点上。

next数组就是他每次的向右转的转向数组,你需要判断牛在下一时刻是否是墙或者是障碍物,农夫john和它一样代码如下
//C
if(x1+next[rex][0]<0||x1+next[rex][0]>9||y1+next[rex][1]<0||y1+next[rex][1]>9||s1[x1+next[rex][0]][y1+next[rex][1]]==1){
			count++;
			rex=(rex+1)%4;
		}else{
			count++;
			x1=x1+next[rex][0];
			y1=y1+next[rex][1];
		}

AC代码如下

#include<stdio.h>
int next[4][2]={-1,0,0,1,1,0,0,-1}; 

int main(void){
	int x1,y1,x2,y2,count=0,rex=0,rex1=0;
	char s[15][15];
	int s1[15][15];

	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			scanf(" %c",&s[i][j]);
			if(s[i][j]=='.')
				s1[i][j]=0;
			else if(s[i][j]=='*')
				s1[i][j]=1;
			else if(s[i][j]=='C'){
				x1=i;y1=j;s1[i][j]=0;
			}else if(s[i][j]=='F'){
				x2=i;y2=j;s1[i][j]=0;
			}
		}
	}

	while(1){
		if(x1==x2 && y1==y2){
			printf("%d\n",count);
			break;
		}	
		if(count>10000){//找不到
			printf("0\n");
			break;
		}
		
		//C
		if(x1+next[rex][0]<0||x1+next[rex][0]>9||y1+next[rex][1]<0||y1+next[rex][1]>9||s1[x1+next[rex][0]][y1+next[rex][1]]==1){
			count++;
			rex=(rex+1)%4;
		}else{
			count++;
			x1=x1+next[rex][0];
			y1=y1+next[rex][1];
		}
		
		//F
		if(x2+next[rex1][0]<0||x2+next[rex1][0]>9||y2+next[rex1][1]<0||y2+next[rex1][1]>9||s1[x2+next[rex1][0]][y2+next[rex1][1]]==1){
			rex1=(rex1+1)%4;
		}else{
			x2=x2+next[rex1][0];
			y2=y2+next[rex1][1];
		}
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值