题目描述
两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10×10的平面网格内进行。一个格子可以是:
一个障碍物,
两头牛(它们总在一起), 或者
农民John.
两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
. 空地
* 障碍物
C 两头牛
F 农民John
这里有一个地图的例子::
*…*…..
……*…
…*…*..
……….
…*.F….
*…..*…
…*……
..C……*
…*.*….
.*.*……
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。
输入
Lines 1-10:
每行10个字符,表示如上文描述的地图。
输出
输出一个数字,表示John需要多少时间才能抓住牛们。输出0,如果John无法抓住牛。
样例输入
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
样例输出
49
参考代码
#include <stdio.h>
int disc,disf,cx,cy,fx,fy,sum;
int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
//â â â â
char map[11][11];
int check(int a,int b)
{
if(a>=0 && a<10 && b>=0 && b<10)
return 1;
return 0;
}
void solve(int ax,int ay,int bx,int by,int num)
{
int x,y;
if(sum)
return ;
if(num>160000)
{
//ç»æ¢æ¡ä»¶
if(ax!=bx || ay!=by)
sum=-1; else
sum=num;
return ;
//æ¾ä¸å°
}
if(ax==bx && ay==by)
{
//æ¾å°
sum=num;
return ;
}
x=dis[disf][0];
y=dis[disf][1];
if(check(ax+x,ay+y) && map[ax+x][ay+y]!='*')
ax+=x,ay+=y; else
disf=(disf+1)%4;
x=dis[disc][0];
y=dis[disc][1];
if(check(bx+x,by+y) && map[bx+x][by+y]!='*')
bx+=x,by+=y; else
disc=(disc+1)%4;
solve(ax,ay,bx,by,num+1);
}
int main()
{
int i,j;
sum=fx=fy=cx=cy=0;
for (i=0;i<10;i++)
{
for (j=0;j<10;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='F')
fx=i,fy=j;
if(map[i][j]=='C')
cx=i,cy=j;
}
getchar();
}
solve(fx,fy,cx,cy,0);
printf("%dn",sum==-1?0:sum);
return 0;
}
解析
暂无