2.4.1 The Tamworth Two 两只塔姆沃斯牛
时间: 1ms 内存:64M
描述:
两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物,
两头牛(它们总在一起), 或者
农民John.
两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。一个格子可以是:
. 空地
* 障碍物
C 两头牛
F 农民John
这里有一个地图的例子::*...*..... ......*... ...*...*.. .......... ...*.F.... *.....*... ...*...... ..C......* ...*.*.... .*.*......牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。
输入:
Lines 1-10:
每行10个字符,表示如上文描述的地图。
输出:
输出一个数字,表示John需要多少时间才能抓住牛们。输出0,如果John无法抓住牛。
示例输入:
*...*.....
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
示例输出:
49
提示:
参考答案(内存最优[752]):
#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("%d\n",sum==-1?0:sum);
return 0;
}
参考答案(时间最优[5]):
#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("%d\n",sum==-1?0:sum);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。