思路:根据题目意思模拟牛和农民的运动过程即可,关键的难点在于判断无法相遇的情况。由于格网大小固定为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; }