USACO 2.2.4 两只塔沃斯母牛

USACO 2.2.4 两只塔沃斯母牛
by MPS
【题目描述】

  两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。 
  追击在10x10的平面网格内进行。一个格子可以是: 
  (1)一个障碍物,  
 (2)两头牛(它们总在一起), 或者  
 (3)农民John.  
  两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。 
  一个格子可以是: 
 . 空地  
 * 障碍物  
 C 两头牛  
 F 农民John  
 这里有一个地图的例子:: 
     *...*.....
     ......*...
     ...*...*..
    ..........
    ...*.F....
    *.....*...
     ...*......
    ..C......*
    ...*.*....
    .*.*......
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。 
农民John, 深知牛的移动方法,他也这么移动。 
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。

【输入描述】                                                                                                                               【输出描述】
描述地图 10*10                                                                                                                             相遇的时间,如果不能相遇,输出0                
【样例输入】                                                                                                                               【样例输出】
*...*.....                                                                                                                                             49
......*...
...*...*..
..........
...*.F....
*.....*...
...*......
..C......*
...*.*....
.*.*......
【分析】
很简单的一个模拟题目,我是用栈来模拟的,我这个蒟蒻较SB,用7个量表示状态:
    奶牛的x坐标,奶牛的y坐标,奶牛当前所面向的方位,农夫的x坐标,农夫的y坐标,农夫当前所面向的方位
 然后只要注意一点,就是他们会花1s来转弯,而不是同一秒内既转弯又走 
 由于每一个状态只会有1个决策,所以最终的搜索树退化为链,O(N)的复杂度,我们又发现,如果农夫和奶牛都走完了整个地图,那么就没必要走下去,必定不能相遇,这个可以减少时间且放止栈溢出
 时间还是挺快的

  【代码】
 
#include <string>
#include <cstdlib>
#include <vector>
#include <queue>
#include <deque>
using namespace std;

const int n=10;
const int UP=1001;//时间上限
 
char board[11][11];
int TIME,CX,CY,FX,FY;

void readfile(){
  freopen("ttwo.in","r",stdin);
  freopen("ttwo.out","w",stdout);
  int i,j;
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++){    	
      cin>>board[i][j];
      if(board[i][j]=='F'){FX=i;FY=j;board[i][j]='.';}
      if(board[i][j]=='C'){CX=i;CY=j;board[i][j]='.';}
    }
}
//0北  1南   2西   3东 
void dfs(int cx,int cy,int pc,int fx,int fy,int fc,int t){
	if(t>=UP)return;
	if(cx==fx && cy==fy){TIME=t;return;}
	int cow_next_x,cow_next_y,farm_next_x,farm_next_y;
	if(pc==0){
		if(cx>1 && board[cx-1][cy]=='.')
		  cow_next_x=cx-1,cow_next_y=cy;
	    else 
	    {
	      cow_next_x=cx;cow_next_y=cy;
	      pc=3;
	    }
	}
	else if(pc==1){
		if(cx<n && board[cx+1][cy]=='.')
		  cow_next_x=cx+1,cow_next_y=cy;
	    else 
	    {
	      cow_next_x=cx;cow_next_y=cy;
	      pc=2;
	    }
	}
	else if(pc==2){
		if(cy-1>0 && board[cx][cy-1]=='.')cow_next_x=cx,cow_next_y=cy-1;
	    else 
	    {
	      cow_next_x=cx;cow_next_y=cy;
	      pc=0;
	    }
	}
	else if(pc==3){
		if(cy<n && board[cx][cy+1]=='.'){cow_next_x=cx;cow_next_y=cy+1;}
	    else 
	    {
	      cow_next_x=cx;cow_next_y=cy;
	      pc=1;
	    }
	}
	if(fc==0){
		if(fx>1 && board[fx-1][fy]=='.')
		  farm_next_x=fx-1,farm_next_y=fy;
	    else 
	    {
	      farm_next_x=fx;farm_next_y=fy;
	      fc=3;
	    }
	}
	else if(fc==1){
		if(fx<n && board[fx+1][fy]=='.')
		  farm_next_x=fx+1,farm_next_y=fy;
	    else 
	    {
	      farm_next_x=fx;farm_next_y=fy;
	      fc=2;
	    }
	}
	else if(fc==2){
		if(fy-1>0 && board[fx][fy-1]=='.')farm_next_x=fx,farm_next_y=fy-1;
	    else 
	    {
	      farm_next_x=fx;farm_next_y=fy;
	      fc=0;
	    }
	}
	else if(fc==3){
		if(fy<n && board[fx][fy+1]=='.'){farm_next_x=fx;farm_next_y=fy+1;fc=3;}
	    else 
	    {
	      farm_next_x=fx;farm_next_y=fy;
	      fc=1;
	    }
	}
	dfs(cow_next_x,cow_next_y,pc,farm_next_x,farm_next_y,fc,t+1);
}

int main(){
  readfile();
  dfs(CX,CY,0,FX,FY,0,0);
  cout<<(TIME>=UP?0:TIME);
  return 0;
}

                               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值