思路:根据题目意思模拟牛和农民的运动过程即可,关键的难点在于判断无法相遇的情况。由于格网大小固定为100x100,而运动的方向有4种,所以牛和农民在格网中所处的位置状态最多不会超过 4x100 x 4x100 = 160000种,所以只需判断总共移动的时间是否超过160000分钟即可判断是否存在死循环。
/*
ID: xpli1
PROG: ttwo
LANG: C
*/
#include <stdio.h>
int grid[12][12] = {0}; /* 0 obstacle
1 square
2 cows
3 farmer
*/
int ci,cj,cd;
int fi,fj,fd;
int dir[4][2] = {-1,0,0,1,1,0,0,-1};
FILE *fin;
FILE *fout;
void init()
{
int i,j;
char ch;
for(i=1; i<11; i++){
for(j=1; j<12; j++){
fscanf(fin,"%c",&ch);
if(ch == '.') grid[i][j] = 1;
else if(ch == 'C') {grid[i][j] = 2;ci = i;cj = j;}
else if(ch == 'F') {grid[i][j] = 3;fi = i;fj = j;}
}
}
cd = fd = 0;
return;
}
void cowmove()
{
if(grid[ci+dir[cd][0]][cj+dir[cd][1]]==0){
cd = (cd+1)%4;
}
else{
grid[ci][cj] = 1;
grid[ci+dir[cd][0]][cj+dir[cd][1]] = 2;
ci = ci + dir[cd][0];
cj = cj + dir[cd][1];
}
}
void farmermove()
{
if(grid[fi+dir[fd][0]][fj+dir[fd][1]]==0){
fd = (fd+1)%4;
}
else{
grid[fi][fj] = 1;
grid[fi+dir[fd][0]][fj+dir[fd][1]] = 3;
fi = fi + dir[fd][0];
fj = fj + dir[fd][1];
}
}
void run()
{
int minutes = 0;
while(1){
// cow move foward
cowmove();
// farmer move foward
farmermove();
minutes++;
// check
if(ci == fi && cj == fj) break;
if(minutes > 160000) {minutes = 0; break;}
}
fprintf(fout,"%d/n",minutes);
}
int main()
{
fin = fopen ("ttwo.in", "r");
fout = fopen ("ttwo.out", "w");
init();
run();
return 0;
}