• 【USACO 2.4.1】两只塔姆沃斯牛


    【题目描述】

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

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

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

    一个格子可以是:

    . 空地 
    * 障碍物 
    C 两头牛 
    F 农民John 
    

    这里有一个地图的例子:

    *...*.....
    ......*...
    ...*...*..
    ..........
    ...*.F....
    *.....*...
    ...*......
    ..C......*
    ...*.*....
    .*.*......
    
    

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

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

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

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

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


    PROGRAM NAME: ttwo

    INPUT FORMAT

    第1-10行:

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

    OUTPUT FORMAT

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

    【分析】

    直接模拟,注意判重。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <cstring>
     7 const int maxn=20+10;
     8 using namespace std;
     9 struct node
    10 {
    11        int x,y;
    12        int d;//方向上下左右 
    13 }f,c;
    14 int map[maxn][maxn];
    15 int vis[15][15][9][15][15][9];
    16 int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
    17 
    18 void move(node &t,int d) {t.x+=dx[d];t.y+=dy[d];}
    19 int work();
    20 void check(node &t);//如果改变过方向就返回1 
    21 int main()
    22 {
    23     int i,j;
    24     //文件操作
    25     freopen("ttwo.in","r",stdin);
    26     freopen("ttwo.out","w",stdout);
    27     memset(map,0,sizeof(map));//顺便给边缘加上了墙 
    28     for (i=1;i<=10;i++)
    29     {
    30         char temp;
    31         for (j=1;j<=10;j++)
    32         {
    33             scanf("%c",&temp);
    34             map[i][j]=temp=='*'?0:1;//只要不是障碍都可以走 
    35             if (temp=='F') {f.x=i;f.y=j;f.d=0;}//约翰起点 
    36             if (temp=='C') {c.x=i;c.y=j;c.d=0;}//奶牛起点 
    37         }
    38         getchar();//注意读取换行符 
    39     }
    40     printf("%d",work());
    41     return 0;
    42 }
    43 int work()
    44 {
    45      int t=0;
    46      memset(vis,0,sizeof(vis));
    47      while (1)
    48      {
    49            vis[f.x][f.y][f.d][c.x][c.y][c.d]=1;
    50            ++t;//时间计数
    51            move(f,f.d);move(c,c.d);//移动 
    52            check(f);check(c);
    53            if (f.x==c.x && f.y==c.y) return t;
    54            if (vis[f.x][f.y][f.d][c.x][c.y][c.d]==1) return 0;//重复了 
    55      }
    56 }
    57 void check(node &t)//是否改变了方向 
    58 {
    59      if (map[t.x][t.y]==0) 
    60      {
    61          move(t,(t.d^1));//是障碍,往回退 
    62          if (t.d==0) t.d=3;
    63          else if (t.d==3) t.d=1;
    64          else if (t.d==1) t.d=2;
    65          else if (t.d==2) t.d=0;
    66      }
    67 }
  • 相关阅读:
    第五单元 shell编程 摩天居士
    第六单元 磁盘阵列与逻辑卷 摩天居士
    第七单元 文件查找与文件特殊权限 摩天居士
    第三单元 文件压缩与磁盘管理 摩天居士
    第二单元 文件和用户管理 摩天居士
    shell编程获取服务器资产信息 摩天居士
    第四单元 正则表达式与软件包管理 摩天居士
    欧姆龙CXOne4.31启动仿真报错 因为计算机中丢失OSLicence.dll。尝试重新安装该程序...
    VS2019 使用QT插件导入项目时导入失败 Please look in the output above for errors and warnings.
    qt5 断开 lambad槽
  • 原文地址:https://www.cnblogs.com/hoskey/p/3800245.html
Copyright © 2020-2023  润新知