码迷,mamicode.com
首页 > 其他好文 > 详细

疯狂的模拟

时间:2016-07-21 15:02:08      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

USACO Section 2.4 两只塔姆沃斯牛 The Tamworth Two

题目描述

两只牛逃跑到了森林里。农夫John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。

追击在10x10的平面网格内进行。一个格子可以是:

一个障碍物, 两头牛(它们总在一起), 或者 农民John. 两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。

一个格子可以是:

. 空地

*障碍物

C 两头牛

F 农民John

这里有一个地图的例子:

*...*.....

......*...

...*...*..

..........

...*.F....

*.....*...

...*......

..C......*

...*.*....

.*.*......

牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍(地图边沿也是障碍),它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。 同时,它们不会离开地图。

农民John深知牛的移动方法,他也这么移动。

每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。

读入十行表示农夫John,两头牛和所有障碍的位置的地图。每行都只包含10个字符,表示的含义和上面所说的相同,你可以确定地图中只有一个‘F‘和一个‘C‘.‘F‘和‘C‘一开始不会处于同一个格子中。

计算农夫John需要多少分钟来抓住他的牛,假设牛和农夫John一开始的行动方向都是正北(即上)。 如果John和牛永远不会相遇,输出0。

输入输出格式

输入格式:

每行10个字符,表示如上文描述的地图。

输出格式:

输出一个数字,表示John需要多少时间才能抓住牛们。如果John无法抓住牛,则输出0。

 

代码没有什么技巧,就(复)是(制)这(和)么(粘)长(贴),就是这么直接(233333)

  1 #include<iostream>
  2 #include<cstring>
  3 using namespace std;
  4 char map[11][11];
  5 int x,y,t,xx,yy,tt;
  6 int v[11][11][5][11][11][5];
  7 void init()
  8 {
  9     memset(v,0,sizeof(v));
 10 }
 11 void getnext(){
 12     switch(t){
 13         case 1:
 14             if(x==1){
 15                 t=4;
 16             }else if(map[x-1][y]==*){
 17                 t=4;
 18             }else{
 19                 x--;
 20             }
 21             break;
 22         case 2:
 23             if(x==10){
 24                 t=3;
 25             }else if(map[x+1][y]==*){
 26                 t=3;
 27             }else{
 28                 x++;
 29             }
 30             break;
 31         case 3:
 32             if(y==1){
 33                 t=1;
 34             }else if(map[x][y-1]==*){
 35                 t=1;
 36             }else{
 37                 y--;
 38             }
 39             break;
 40         case 4:
 41             if(y==10){
 42                 t=2;
 43             }else if(map[x][y+1]==*){
 44                 t=2;
 45             }else{
 46                 y++;
 47             }
 48             break;
 49     }
 50     
 51     switch(tt){
 52         case 1:
 53             if(xx==1){
 54                 tt=4;
 55             }else if(map[xx-1][yy]==*){
 56                 tt=4;
 57             }else{
 58                 xx--;
 59             }
 60             break;
 61         case 2:
 62             if(xx==10){
 63                 tt=3;
 64             }else if(map[xx+1][yy]==*){
 65                 tt=3;
 66             }else{
 67                 xx++;
 68             }
 69             break;
 70         case 3:
 71             if(yy==1){
 72                 tt=1;
 73             }else if(map[xx][yy-1]==*){
 74                 tt=1;
 75             }else{
 76                 yy--;
 77             }
 78             break;
 79         case 4:
 80             if(yy==10){
 81                 tt=2;
 82             }else if(map[xx][yy+1]==*){
 83                 tt=2;
 84             }else{
 85                 yy++;
 86             }
 87             break;
 88     }
 89 }
 90 int main()
 91 {
 92     init();
 93     for(int i=1;i<=10;i++){
 94         for(int j=1;j<=10;j++){
 95             cin>>map[i][j];
 96             if(map[i][j]==C){
 97                 x=i,y=j,t=1;
 98             }
 99             if(map[i][j]==F){
100                 xx=i,yy=j,tt=1;
101             }
102         }
103     }
104     int ans=0;
105     while(true){
106         if(v[x][y][t][xx][yy][tt]){
107             cout<<0<<endl;
108             return 0;
109         }
110         v[x][y][t][xx][yy][tt]=v[xx][yy][tt][x][y][t]=1;
111         if(x==xx&&y==yy){
112             cout<<ans;
113             return 0;
114         }
115         getnext();
116         ans++;
117     }    
118     return 0;
119 }

 

疯狂的模拟

标签:

原文地址:http://www.cnblogs.com/gzhonghui/p/5691625.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!