题目描述
两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物, | |
两头牛(它们总在一起), 或者 | |
农民John. |
一个格子可以是:
| 这里有一个地图的例子:: *...*..... ......*... ...*...*.. .......... ...*.F.... *.....*... ...*...... ..C......* ...*.*.... .*.*...... |
农民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;
}