3711 - 追牛
Time Limit : 1 秒
Memory Limit : 128 MB
两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物,
两头牛(它们总在一起), 或者
农民John.
<span style="font-size:16px;">两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。</span>
<span style="font-size:16px;">一个格子可以是:</span>
<span style="font-size:16px;"> . 空地 </span><br />
* 障碍物
C 两头牛
F 农民John
这里有一个地图的例子::
<span style="font-size:16px;">*...*.....</span><br />
.........
........
..........
....F....
........
.........
..C......
........
........
<span style="font-size:16px;">牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。</span>
<span style="font-size:16px;">农民John, 深知牛的移动方法,他也这么移动。</span>
<span style="font-size:16px;">每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。</span>
Input
Lines 1-10:
每行10个字符,表示如上文描述的地图。
Output
输出一个数字,表示John需要多少时间才能抓住牛们。输出0,如果John无法抓住牛。
Examples
Input Format
*...*..... ......*... ...*...*.. .......... ...*.F.... *.....*... ...*...... ..C......* ...*.*.... .*.*......
Output Format
49
Solution C
#include<stdio.h> #include<string.h> int main() { int i1,i2,j1,j2,i,x[12][12]={0},k=1,m=0,n=0,sum=0; char c[12]; for(i=0;i<=11;i++) x[i][0]=x[0][i]=x[11][i]=x[i][11]=1; while(scanf("%s",c)==1&&strlen(c)>5) { for(i=0;i<10;i++) { if(c[i]=='*')x[k][i+1]=1; else if(c[i]=='C'){x[k][i+1]=0;i1=k;i2=i+1;} else if(c[i]=='F'){x[k][i+1]=0;j1=k;j2=i+1;} } k++; if(k==11){ while(i1!=j1||i2!=j2) { if(m==0)if(x[i1-1][i2]==1)m=1;else i1--; else if(m==1)if(x[i1][i2+1]==1)m=2;else i2++; else if(m==2)if(x[i1+1][i2]==1)m=3;else i1++; else if(m==3)if(x[i1][i2-1]==1)m=0;else i2--; if(n==0)if(x[j1-1][j2]==1)n=1;else j1--; else if(n==1)if(x[j1][j2+1]==1)n=2;else j2++; else if(n==2)if(x[j1+1][j2]==1)n=3;else j1++; else if(n==3)if(x[j1][j2-1]==1)n=0;else j2--; sum++; if(sum>10000)break; } if(sum<10000)printf("%d\n",sum);else printf("0\n"); memset(x,0,sizeof(x));k=1;m=0;n=0; for(i=0;i<=11;i++) x[i][0]=x[0][i]=x[11][i]=x[i][11]=1; sum=0; } } return 1; }
Solution C++
#include<stdio.h> struct node { int x,y; int move; }; char a[10][10]; void move(node& animal) { switch (animal.move) { case 0: { if (animal.x==0||a[animal.x-1][animal.y]=='*') animal.move=(animal.move+1)%4; else animal.x--; break; } case 1: { if (animal.y==9||a[animal.x][animal.y+1]=='*') animal.move=(animal.move+1)%4; else animal.y++; break; } case 2: { if (animal.x==9||a[animal.x+1][animal.y]=='*') animal.move=(animal.move+1)%4; else animal.x++; break; } case 3: { if (animal.y==0||a[animal.x][animal.y-1]=='*') animal.move=(animal.move+1)%4; else animal.y--; break; } } } int main() { while(scanf("%s",a[0])!=EOF) { for (int i=1;i<10;i++) scanf("%s",a[i]); node people,niu; int x,y,x1,y1; for (int i=0;i<10;i++) for (int j=0;j<10;j++) { if (a[i][j]=='C') {x=niu.x=i;y=niu.y=j;niu.move=0;} if (a[i][j]=='F') {x1=people.x=i;y1=people.y=j;people.move=0;} } int all=0; int ok=0; while(niu.x!=people.x||niu.y!=people.y) { all++; move(niu); move(people); if (all>=160000) {printf("0\n");ok=1;break;} } if (!ok) printf("%d\n",all); } return 0; }