USACO 2.2.4 两只塔沃斯母牛

来源:互联网 发布:网页版淘宝 编辑:程序博客网 时间:2024/05/29 14:15
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;}

                               

0 0
原创粉丝点击