题目描述
两只牛逃跑到了森林里。Farmer John 开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和 John)。
追击在 10×1010 \times 1010×10 的平面网格内进行。一个格子可以是:一个障碍物,两头牛(它们总在一起),或者 Farmer John。两头牛和 Farmer John 可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
. 空地;
* 障碍物;
C 两头牛;
F Farmer John。
这里有一个地图的例子:
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转 90 度。 同时,它们不会离开地图。
Farmer John 深知牛的移动方法,他也这么移动。
每次(每分钟)Farmer John 和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。
读入十行表示地图。每行都只包含 10 个字符,表示的含义和上面所说的相同。保证地图中只有一个 F 和一个 C。F 和 C 一开始不会处于同一个格子中。
计算 Farmer John 需要多少分钟来抓住他的牛,假设牛和 Farmer John 一开始的行动方向都是正北(即上)。 如果 John 和牛永远不会相遇,输出 0。
输入格式
输入共十行,每行 10 个字符,表示如上文描述的地图。
输出格式
输出一个数字,表示 John 需要多少时间才能抓住牛们。如果 John 无法抓住牛,则输出 0。
输入输出样例
输入 #1
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
输出 #1
49
解题思路:
模拟,把每次牛和农夫走的点都进行对比,如果相等就输出时间,我假如时间大于50000就是代表不会相遇
程序代码:
#include<stdio.h>
char s[20][20];
int next[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int tx1,ty1,tx2,ty2;
int main()
{
int i,j,k1,k2,n,m,p1,q1,p2,q2,flag,sum,v1,v2,w1,w2;
sum=0;
for(i=0;i<10;i++)
scanf(" %s",s[i]);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
if(s[i][j]=='F')
{
tx1=p1=i;ty1=q1=j;
}
if(s[i][j]=='C')
{
tx2=p2=i;ty2=q2=j;
}
}
flag=0;
v1=v2=-1;
w1=w2=0;//最初农夫和牛向北方向走
k1=k2=0; //记录旋转的方向
while(1)
{
sum++;
tx1=tx1+v1;
ty1=ty1+w1;
if(ty1<0||ty1>9||tx1<0||tx1>9||s[tx1][ty1]=='*')//防止数组会越界
{
k1++;
tx1=p1;ty1=q1; //如果走到墙或者走出的区域则让坐标还是等于上一步坐标,该步为旋转方向
v1=next[k1%4][0];w1=next[k1%4][1];
}
else
{
p1=tx1;q1=ty1;//把农夫的坐标保存一下
}
tx2=tx2+v2;
ty2=ty2+w2;
if(tx2<0||tx2>9||ty2<0||ty2>9||s[tx2][ty2]=='*')
{
k2++;
tx2=p2;ty2=q2;
v2=next[k2%4][0];w2=next[k2%4][1];
}
else
{
p2=tx2;q2=ty2;
}
//printf("%d %d %d %d\n",p2,q2,p1,q1);
if(p1==p2&&q1==q2)//比较两个坐标是否相等
{
flag=1;break;
}
if(sum>50000)
break;
}
if(flag==1)
printf("%d\n",sum);
else
printf("0\n");
return 0;
}