牛和农夫按照固定的走法在10x10的地图中走,每分钟走一步,求经过几分钟相遇。永远不能相遇输出0.

纯模拟的题。

判断永远不能相遇的方法是如果遇到了一个先前的状态,那么肯定存在循环,必定不能相遇。

程序中把状态表示为牛和农夫的位置以及面向的方向,通过map判断是否遇到重复状态,因为map中不存在的键会有默认值,对于bool来说就是false。

一点点空间的优化是地图只用存一份,牛和农夫不显示在地图上,尽通过状态里的点间接表示。

View Code

  1 /*
  2 ID: xjtuacm1
  3 PROG: ttwo
  4 LANG: C++
  5 */
  6 #include<iostream>
  7 #include<stack>
  8 #include<cstring>
  9 #include<cstdio>
 10 #include<queue>
 11 #include<algorithm>
 12 #include<map>
 13 using namespace std;
 14
 15 const int N = 10;
 16 enum direction {NORTH, EAST, SOUTH, WEST};
 17
 18 struct point
 19 {
 20     int x, y;
 21     point(int xx= 0, int yy = 0) :x(xx), y(yy) {}
 22     void set(int xx, int yy)
 23     {
 24         x = xx;
 25         y = yy;
 26     }
 27     bool operator==(const point& pt) const
 28     {
 29         return x == pt.x && y == pt.y;
 30     }
 31 };
 32
 33 struct state
 34 {
 35     int d[2];
 36     point pt[2];
 37     state() { d[0] = d[1] = NORTH; }
 38
 39     bool operator<(const state& s) const
 40     {
 41         return memcmp(this, &s, sizeof(state)) < 0;
 42     }
 43 };
 44
 45 map<state, bool> h;
 46 char pane[N][N];
 47
 48 inline bool inRange(point pt)
 49 {
 50     return pt.x >= 0
 51             && pt.x < 10
 52             && pt.y >= 0
 53             && pt.y < 10;
 54 }
 55
 56 bool met(const state& s)
 57 {
 58     return s.pt[0] == s.pt[1];
 59 }
 60
 61 void next(state& s)
 62 {
 63     point npt[2];
 64
 65     for(int i = 0; i!= 2; i++)
 66     {
 67         switch(s.d[i])
 68         {
 69         case NORTH:
 70             npt[i].set(s.pt[i].x - 1, s.pt[i].y);
 71             break;
 72         case EAST:
 73             npt[i].set(s.pt[i].x, s.pt[i].y + 1);
 74             break;
 75         case SOUTH:
 76             npt[i].set(s.pt[i].x + 1, s.pt[i].y);
 77             break;
 78         case WEST:
 79             npt[i].set(s.pt[i].x, s.pt[i].y - 1);
 80             break;
 81         }
 82
 83         if(inRange(npt[i])
 84             && pane[npt[i].x][npt[i].y] != '*')
 85         {
 86             s.pt[i] = npt[i];
 87         }
 88         else
 89         {
 90             s.d[i] += 1;
 91             s.d[i] %= 4;
 92         }
 93     }
 94 }
 95
 96 int main(int argc, char *argv[])
 97 {
 98     freopen("ttwo.in", "r", stdin);
 99 #ifndef USACO
100     freopen("ttwo.out", "w", stdout);
101 #endif // USACO
102
103     state s;
104
105     for(int i = 0; i!= N; i++)
106         for(int j = 0; j!= N; j++)
107     {
108         scanf("%c", &pane[i][j]);
109         if(pane[i][j] == '\n')
110             scanf("%c", &pane[i][j]);
111
112         if(pane[i][j] == 'F'
113             || pane[i][j] == 'C')
114             {
115                 int t = (pane[i][j] - 'C' == 0 ? 0 : 1);
116                 s.pt[t].set(i, j);
117                 pane[i][j] = '.';
118             }
119     }
120
121     int minute = 0;
122     h[s] = true;
123     while(!met(s))
124     {
125         next(s);
126         if(h[s])
127         {
128             printf("0\n");
129             return 0;
130         }
131
132         h[s] = true;
133         minute++;
134     }
135
136     printf("%d\n", minute);
137
138     return 0;
139 }

BTW,纯模拟真心考验细心程度= =。。。。

转载于:https://www.cnblogs.com/tech-cabin/archive/2013/02/05/2893386.html

USACO 2.4.1 The Tamworth Two相关推荐

  1. usaco The Tamworth Two 两只塔姆沃斯牛

    两只牛在森林里故意走丢了.农民 John 开始用他的专家技术追捕这两头牛.你的任务是模拟他们的 行为(牛和 John). 追击在 10x10 的平面网格内进行.一个格子可以是: 一个障碍物, 两头牛( ...

  2. usaco The Tamworth Two

    john和牛在二维的图里面跑,john要抓住牛. 牛和john在遇到墙或者图的边界时都会花一单位的时间顺时针转动90度.否则花一单位时间往前走一格,当牛和john走到同一个格子中时,john抓住了牛. ...

  3. [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

    文章目录 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 题解: [USACO2.4]两只塔姆沃斯 ...

  4. P1518 两只塔姆沃斯牛 The Tamworth Two(模拟)

    P1518 两只塔姆沃斯牛 The Tamworth Two 219通过 418提交 题目提供者该用户不存在 标签 USACO 难度 普及+/提高 时空限制 1s / 128MB 2017/4/21 ...

  5. 洛谷P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

    两只塔姆沃斯牛 The Tamworth Two 一.题目信息 1.题目链接 2.题目详情 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 二.题目详解 1.逻辑 2.代码 (1 ...

  6. 洛谷 P1518 两只塔姆沃斯牛 The Tamworth Two

    P1518 两只塔姆沃斯牛 The Tamworth Two 题目背景 题目描述 两只牛逃跑到了森林里.农夫John开始用他的专家技术追捕这两头牛.你的任务是模拟他们的行为(牛和John). 追击在1 ...

  7. usaco Shaping Regions

    这就是usaco 前面的windows area的变形. /* ID:jinbo wu TASK:rect1 LANG:C++ */ #include<iostream> #include ...

  8. usaco Postal Vans(dp)

    是哈密顿回路,然后...就不知道怎么写了 ,以前写过类似的不过情况没这么多也没这么复 usaco training 6.1.1 Postal Vans 题解 标签: usaco training题解d ...

  9. usaco Beef McNuggets

    这两天贼烦,ccf炸了,还有一个烦心事.哎我都不知道自己能不能坚持下去了.马上期末考了.这段时间还是抓紧时间复习吧同时刷usaco的节奏要跟以前一样了,毕竟课少了. 题解: 只要你知道以下的数论结论, ...

最新文章

  1. 【转】InstantClient安装使用
  2. Linux head和tail指令
  3. MySQL数据库创建及删除操作
  4. 服务器windows模拟linux环境,科学网—Windows不用虚拟机或双系统,轻松实现shell环境:gitforwindows - 刘永鑫的博文...
  5. Mr.J-- jQuery学习笔记(三十)--属性操作方法(添加删除)
  6. java界面编程 pdf_java – PDF页面使用itext重新排序
  7. AcWing 802. 区间和
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_11-MongoDb入门-安装Mongodb数据库...
  9. EXE文件反编译工具下载
  10. 读《看见》第一章观后有感
  11. java语音识别毕业设计,HMM的语音识别技术的毕业设计
  12. 基于Qt的智能管家客户端设计
  13. 由错误<note: candidate expects 1 argument, 0 provided>引发的思考
  14. 前端如何下载excel表格
  15. Arduino零基础实践——1
  16. 用 PHP 进行 HTTP 认证,Basic Auth
  17. Codeforces847M Weather Tomorrow
  18. 讲给后台程序员看的前端系列教程(38)——事件处理
  19. Intellij IDEA 最新旗舰版注册激活破解(亲测,可用)
  20. 学python要有多少英语词汇量_“扫地僧”!自学Python编程、英语词汇量15000……北大保安再上热搜...

热门文章

  1. idea 代码第一次上传git_如何使用IDEA将项目代码首次上传至GitHub,并持续推送?...
  2. matlab计算海洋浮力频率_帝国理工学院海洋、海岸与建筑环境工程流体力学理学硕士研究生offer一枚...
  3. 信息竞赛进阶指南--最小表示法
  4. hive安装测试及Hive 元数据的三种存储方式
  5. SDI, DVI, HDMI, DisplayPort的区别(Z)
  6. C++笔记——有关内存对齐
  7. ai人工智能的本质和未来_人工智能的未来在于模型压缩
  8. 中国还有一个作家叫格非
  9. 《北妹》:中国七零后作家的一次火山喷发(答记者问)
  10. 项目中使用 java函数式编程_函数式编程在Java8中使用Lambda表达式进行开发