题目大意:

很多武器, 很多老鼠, 模拟若干秒.(实际题意要麻烦很多)

简要分析:

算法????

我会告诉你除了模拟之外就没了么????

写模拟的时候用点平时从来不用的语法感觉很爽啊......虚基类......继承......多态......

代码实现:

View Code

  1 #include <cassert>
  2 #include <cctype>
  3 #include <cmath>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cstring>
  7 #include <utility>
  8 #include <functional>
  9 #include <string>
 10 #include <bitset>
 11 #include <deque>
 12 #include <list>
 13 #include <map>
 14 #include <queue>
 15 #include <set>
 16 #include <stack>
 17 #include <vector>
 18 #include <iterator>
 19 #include <algorithm>
 20 #include <complex>
 21 #include <valarray>
 22 #include <numeric>
 23
 24 using namespace std;
 25
 26 const int kMaxL = 10, kMaxR = 10, kMaxN = 50, kMaxM = 50, kMaxK = 50, kMaxP = 100;
 27 const int kFx[4] = {-1, 0, 1, 0}, kFy[4] = {0, 1, 0, -1};
 28 // 0 - N, 1 - E, 2 - S, 3 - W
 29 char idx[256];
 30 int l, r, n, m, k, p, limit, tot, cur;
 31 int grid[kMaxN][kMaxM];
 32
 33 struct Mouse {
 34     bool exist;
 35     int x, y, dir, cnt;
 36     bool sex;
 37     int stun, fxxk, part, grow;
 38     bool right;
 39     void scan() {
 40         scanf("%d%d", &x, &y);
 41         -- x, -- y;
 42         char tmp[2];
 43         scanf("%s", tmp);
 44         dir = idx[(int)tmp[0]];
 45         scanf("%s", tmp);
 46         sex = (tmp[0] == 'X');
 47         exist = true;
 48         part = -1;
 49     }
 50     void move() {
 51         part = -1;
 52         if (grid[x][y] >> dir & 1) {
 53             x += kFx[dir];
 54             y += kFy[dir];
 55         }
 56         else {
 57             int dr = dir, dl = dir;
 58             dr = (dr + 1) % 4;
 59             dl = (dl - 1 + 4) % 4;
 60             if (!(grid[x][y] >> dl & 1) && !(grid[x][y] >> dr & 1)) {
 61                 dir = dl;
 62             }
 63             else {
 64                 if ((grid[x][y] >> dl & 1) && (grid[x][y] >> dr & 1)) {
 65                     if (right) dir = dr;
 66                     else dir = dl;
 67                     right ^= 1;
 68                 }
 69                 else if (grid[x][y] >> dl & 1) {
 70                     dir = dl;
 71                 }
 72                 else {
 73                     dir = dr;
 74                 }
 75             }
 76         }
 77     }
 78 };
 79
 80 Mouse mice[kMaxK * 10];
 81
 82 void DealWithGrow() {
 83     for (int i = 0; i < k; ++ i)
 84         if (mice[i].exist && !mice[i].stun && mice[i].grow)
 85             -- mice[i].grow;
 86 }
 87
 88 void DealWithFxxk() {
 89     for (int i = 0; i < k; ++ i)
 90         if (mice[i].exist && mice[i].fxxk && mice[mice[i].part].exist && i < mice[i].part) {
 91             if (!mice[i].stun && !mice[mice[i].part].stun) {
 92                 -- mice[i].fxxk, -- mice[mice[i].part].fxxk;
 93                 if (!mice[i].fxxk) {
 94                     mice[i].stun = mice[mice[i].part].stun = 1;
 95                     for (int d = 0; d < 4; ++ d)
 96                         if (grid[mice[i].x][mice[i].y] >> d & 1) {
 97                             mice[k].x = mice[i].x;
 98                             mice[k].y = mice[i].y;
 99                             mice[k].sex = (d % 2 == 0);
100                             mice[k].grow = 5;
101                             mice[k].dir = d;
102                             mice[k].exist = true;
103                             mice[k].part = -1;
104                             ++ k;
105                         }
106                 }
107             }
108         }
109     static int cnt[kMaxN][kMaxM];
110     memset(cnt, 0, sizeof(cnt));
111     for (int i = 0; i < k; ++ i)
112         if (mice[i].exist) cnt[mice[i].x][mice[i].y] ++;
113     for (int i = 0; i < k - 1; ++ i)
114         for (int j = i + 1; j < k; ++ j)
115             if (!mice[i].fxxk && !mice[j].fxxk && mice[i].exist && mice[j].exist && !mice[i].grow && !mice[j].grow && mice[i].x == mice[j].x && mice[i].y == mice[j].y && cnt[mice[i].x][mice[i].y] == 2 && (mice[i].sex ^ mice[j].sex) == 1 && !mice[i].stun && !mice[j].stun && (mice[i].part != j || mice[j].part != i)) {
116                 mice[i].fxxk = mice[j].fxxk = 2;
117                 mice[i].part = j, mice[j].part = i;
118             }
119 }
120
121 void DealWithMove() {
122     for (int i = 0; i < k; ++ i)
123         if (mice[i].stun) -- mice[i].stun;
124         else if (!mice[i].fxxk) mice[i].move();
125 }
126
127 struct WeapMother {
128     int x, y, t;
129     WeapMother() {}
130     virtual void expose() = 0;
131     void get() {
132         scanf("%d%d%d", &t, &x, &y);
133         -- x, -- y;
134     }
135 };
136
137 struct Weap0 : public WeapMother {
138     virtual void expose() {
139         if (t != cur) return;
140         static bool mark[kMaxN][kMaxM];
141         memset(mark, false, sizeof(mark));
142         for (int d = 0; d < 4; ++ d) {
143             int nx = x, ny = y, len = 0;
144             mark[nx][ny] = true;
145             while (grid[nx][ny] >> d & 1) {
146                 ++ len;
147                 if (len > l) break;
148                 nx += kFx[d], ny += kFy[d];
149                 mark[nx][ny] = true;
150             }
151         }
152         for (int i = 0; i < k; ++ i)
153             if (mark[mice[i].x][mice[i].y]) mice[i].exist = false;
154     }
155 };
156
157 struct Weap1 : public WeapMother {
158 #define SQR(x) ((x) * (x))
159     virtual void expose() {
160         if (t != cur) return;
161         for (int i = 0; i < k; ++ i)
162             if (SQR(mice[i].x - x) + SQR(mice[i].y - y) <= r * r) {
163                 mice[i].stun += 3;
164             }
165     }
166 #undef SQR
167 };
168
169 struct Weap2 : public WeapMother {
170     virtual void expose() {
171         if (t != cur) return;
172         for (int i = 0; i < k; ++ i)
173             if (mice[i].x == x && mice[i].y == y)
174                 mice[i].exist = false;
175     }
176 };
177
178 struct Weap3 : public WeapMother {
179     virtual void expose() {
180         if (t != cur) return;
181         for (int i = 0; i < k; ++ i)
182             if (mice[i].x == x && mice[i].y == y)
183                 mice[i].sex ^= 1;
184     }
185 };
186
187 WeapMother *weap[kMaxP];
188
189 int main() {
190     idx['N'] = 0, idx['E'] = 1, idx['S'] = 2, idx['W'] = 3;
191     scanf("%d%d%d%d", &l, &r, &n, &m);
192     for (int i = 0; i < n; ++ i)
193         for (int j = 0; j < m; ++ j)
194             scanf("%d", &grid[i][j]);
195     scanf("%d", &k);
196     for (int i = 0; i < k; ++ i)
197         mice[i].scan();
198     scanf("%d%d", &p, &limit);
199     for (int i = 0; i < p; ++ i) {
200         int type;
201         scanf("%d", &type);
202         -- type;
203         if (type == 0) {
204             Weap0 *nw = new Weap0;
205             nw->get();
206             weap[i] = nw;
207         }
208         else if (type == 1) {
209             Weap1 *nw = new Weap1;
210             nw->get();
211             weap[i] = nw;
212         }
213         else if (type == 2) {
214             Weap2 *nw = new Weap2;
215             nw->get();
216             nw->t += 3;
217             weap[i] = nw;
218         }
219         else {
220             Weap3 *nw = new Weap3;
221             nw->get();
222             weap[i] = nw;
223         }
224     }
225     scanf("%d", &tot);
226     cur = -1;
227     int mice_cnt;
228     while (++ cur <= tot) {
229         for (int i = 0; i < p; ++ i) weap[i]->expose();
230         DealWithGrow();
231         DealWithFxxk();
232         DealWithMove();
233         mice_cnt = 0;
234         for (int i = 0; i < k; ++ i)
235             mice_cnt += mice[i].exist;
236         if (mice_cnt > limit) {
237             printf("-1\n");
238             return 0;
239         }
240     }
241     printf("%d\n", mice_cnt);
242     return 0;
243 }

转载于:https://www.cnblogs.com/zcwwzdjn/archive/2012/07/06/2580038.html

[除草]BZOJ 2548 灭鼠计划相关推荐

  1. (全网最详细!)bzoj 2548 灭鼠行动 模拟 解题报告

    Description 最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠.下水道只有东西方向和南北方向的管道,如图所示. 灭鼠特工队的队员拥有强大的武器.他们将在某些时刻t ...

  2. bzoj 1179 抢掠计划atm (缩点+有向无环图DP)

    bzoj 1179 抢掠计划atm (缩点+有向无环图DP) 手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/ar ...

  3. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  4. BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...

  5. bzoj 乱刷计划 50/50

    前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...

  6. BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...

  7. 论逗逼的自我修养——BZOJ第一页计划

    感觉都干了这么久BZOJ了,还没有上第一页有点对不起我的300块大洋,打算在WC前淦上第一页. upd 1. 2 : 以奇怪的姿势做完了cerc2014感觉感觉做了3天做了没几道不太水的题,今天又以刷 ...

  8. bzoj 刷题计划~_~

    bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...

  9. 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)

    这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...

最新文章

  1. 百例1-10(一到三章)总结
  2. 滴滴开源AI项目登上GitHub热榜,人机对话模型可从论文到产品部署无缝衔接
  3. 空腹吃香蕉对身体好吗?哪些水果不宜空腹吃
  4. php重置下标有什么用,怎么在PHP中删除空数组并重置数组键名
  5. iOS之深入定制基于PLeakSniffer和MLeaksFinder的内存泄漏检测工具
  6. 自动刷新获取wifi信号强度,android
  7. java jsp总结
  8. No style sheet with given id found错误
  9. java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
  10. 国产电影凭什么霸屏电影院?
  11. 训练集,测试集和验证集
  12. 如何使用python游戏开发模块—pygame?
  13. 思科(Cisco)交换机路由器命令大全
  14. 浙大吴飞“舌战”阿里贾扬清:AI内卷与年薪百万,哪个才是真实?
  15. jmeter性能测试常用插件简介
  16. 经典分割线 html分割线
  17. ibm ilog mysql_IBM ILOG CPLEX Optimization Studio: 一个整数规划的案例
  18. 收藏!5款超级好用的小工具推荐,各个都是同类软件中的翘楚
  19. ftp文件夹错误_搞定共享文件夹设置 局域网共享一键修复
  20. —个幸存者游戏给出的10个启示(经典)

热门文章

  1. java如何返回树形结构
  2. java毕业设计扶贫助农与产品合作系统mybatis+源码+调试部署+系统+数据库+lw
  3. linux在bashrc中添加变量,嵌入式 Linux下永久生效环境变量bashrc
  4. 【功能剧透】自然语言仪表盘,搜索一下即刻分析
  5. linux安装mt7601网卡固件,树莓派 kali linux MT7601U安装
  6. 配置HylaFAX传真服务器
  7. C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表
  8. 华北水利水电大学c语言实验报告5
  9. 【hexo】butterfly主题添加备案信息
  10. PyTorch 学习by_LX(一):pytorch GPU版本安装等碎碎念