USACO :The Tamworth Two解题报告

    技术2022-05-19  22

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

     

     


    最新回复(0)