题目描述
两只牛在森林里故意走丢了。农民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;
}