USACO :The Tamworth Two解题报告

思路:根据题目意思模拟牛和农民的运动过程即可,关键的难点在于判断无法相遇的情况。由于格网大小固定为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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值