[除草]BZOJ 2548 灭鼠计划
题目大意:
很多武器, 很多老鼠, 模拟若干秒.(实际题意要麻烦很多)
简要分析:
算法????
我会告诉你除了模拟之外就没了么????
写模拟的时候用点平时从来不用的语法感觉很爽啊......虚基类......继承......多态......
代码实现:
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 灭鼠计划相关推荐
- (全网最详细!)bzoj 2548 灭鼠行动 模拟 解题报告
Description 最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠.下水道只有东西方向和南北方向的管道,如图所示. 灭鼠特工队的队员拥有强大的武器.他们将在某些时刻t ...
- bzoj 1179 抢掠计划atm (缩点+有向无环图DP)
bzoj 1179 抢掠计划atm (缩点+有向无环图DP) 手动博客搬家: 本文发表于20170716 10:58:18, 原地址https://blog.csdn.net/suncongbo/ar ...
- BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...
- BZOJ 1799 [Ahoi2009] self 同类分布(数位DP)【BZOJ千题计划(quexin】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/1799(样例时限设置有问题,应该为 2 ...
- bzoj 乱刷计划 50/50
前言 话说第一个板刷计划由于种种原因而告一段落了..其实那一版还有很多题想做,那就只能放一放了 附上效果图一张(几乎每一题都在我博客有题解): 打算 可以复习,重做自己做过的题,不局限于没做过的 乱刷 ...
- BZOJ 2150. 部落战争(最小路径覆盖问题)【BZOJ千题计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 刷题就图一乐 题目链接 https://hydro.ac/d/bzoj/p/2150 是 hydro ...
- 论逗逼的自我修养——BZOJ第一页计划
感觉都干了这么久BZOJ了,还没有上第一页有点对不起我的300块大洋,打算在WC前淦上第一页. upd 1. 2 : 以奇怪的姿势做完了cerc2014感觉感觉做了3天做了没几道不太水的题,今天又以刷 ...
- bzoj 刷题计划~_~
bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...
- 值得一做》关于并查集的进化题目 BZOJ1015(BZOJ第一页计划)(normal-)
这道题和以前做过的一道经典的洪水冲桥问题很像,主要做法是逆向思维.(BZOJ第10道非SB题纪念) 先给出题目 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者 ...
最新文章
- 百例1-10(一到三章)总结
- 滴滴开源AI项目登上GitHub热榜,人机对话模型可从论文到产品部署无缝衔接
- 空腹吃香蕉对身体好吗?哪些水果不宜空腹吃
- php重置下标有什么用,怎么在PHP中删除空数组并重置数组键名
- iOS之深入定制基于PLeakSniffer和MLeaksFinder的内存泄漏检测工具
- 自动刷新获取wifi信号强度,android
- java jsp总结
- No style sheet with given id found错误
- java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
- 国产电影凭什么霸屏电影院?
- 训练集,测试集和验证集
- 如何使用python游戏开发模块—pygame?
- 思科(Cisco)交换机路由器命令大全
- 浙大吴飞“舌战”阿里贾扬清:AI内卷与年薪百万,哪个才是真实?
- jmeter性能测试常用插件简介
- 经典分割线 html分割线
- ibm ilog mysql_IBM ILOG CPLEX Optimization Studio: 一个整数规划的案例
- 收藏!5款超级好用的小工具推荐,各个都是同类软件中的翘楚
- ftp文件夹错误_搞定共享文件夹设置 局域网共享一键修复
- —个幸存者游戏给出的10个启示(经典)
热门文章
- java如何返回树形结构
- java毕业设计扶贫助农与产品合作系统mybatis+源码+调试部署+系统+数据库+lw
- linux在bashrc中添加变量,嵌入式 Linux下永久生效环境变量bashrc
- 【功能剧透】自然语言仪表盘,搜索一下即刻分析
- linux安装mt7601网卡固件,树莓派 kali linux MT7601U安装
- 配置HylaFAX传真服务器
- C语言基础用基本的循环语句打印实心和空心菱形、九九乘法表
- 华北水利水电大学c语言实验报告5
- 【hexo】butterfly主题添加备案信息
- PyTorch 学习by_LX(一):pytorch GPU版本安装等碎碎念