模拟即可。
无解条件为:
(1)农夫、奶牛回到原位且方向均为正北。
(2)经历了超过10000分钟(农夫、奶牛均至多有100个位置)。
中的任一个,
而不能使农夫奶牛回到原位(苯渣的一次WA!)
注意题目中对移动方式的定义:转弯也需要1分钟。
/*
ID:szwjcch971
LANG:C++
TASK:ttwo
*/
#include "stdio.h"
#include "string.h"
char map[12][13];
int main(){
int i,j,k,l,n,DirF=0,DirC=0,Cx,Cy,Fx,Fy,Time,OCx,OCy,OFx,OFy;
char s[10];
FILE *fin=fopen("ttwo.in","r");
FILE *fout=fopen("ttwo.out","w");
memset(map,0,sizeof(map));
for(i=1;i<=10;i++){
fscanf(fin,"%s",&s);
map[i][0]='*';
strcat(map[i],s);
map[i][11]='*';
//printf("Map %d:\'%s\'\n",i,map[i]);
}
strcpy(map[0],"************");
strcpy(map[11],"************");
for(i=1;i<=10;i++){
for(j=1;j<=10;j++){
if(map[i][j]=='F'){
OFx=Fx=i;
OFy=Fy=j;
}
if(map[i][j]=='C'){
OCx=Cx=i;
OCy=Cy=j;
}
}
}
Time=0;
while(1){
Time++;
switch(DirF){
case 0:
Fx--;break;
case 1:
Fy++;break;
case 2:
Fx++;break;
case 3:
Fy--;break;
default:break;
}
switch(DirC){
case 0:
Cx--;break;
case 1:
Cy++;break;
case 2:
Cx++;break;
case 3:
Cy--;break;
default:break;
}
if(map[Fx][Fy]=='*'){
switch(DirF){
case 0:
DirF++;Fx++;break;
case 1:
DirF++;Fy--;break;
case 2:
DirF++;Fx--;break;
case 3:
DirF=0;Fy++;break;
default:break;
}
}
if(map[Cx][Cy]=='*'){
switch(DirC){
case 0:
DirC++;Cx++;break;
case 1:
DirC++;Cy--;break;
case 2:
DirC++;Cx--;break;
case 3:
DirC=0;Cy++;break;
default:break;
}
}
if(Time>10001){
Time=0;
break;
}
if((Fx==Cx)&&(Fy==Cy)){
break;
}
}
fprintf(fout,"%d\n",Time);
return 0;
}