[除草]BZOJ 2548 灭鼠计划
题目大意:
很多武器, 很多老鼠, 模拟若干秒.(实际题意要麻烦很多)
简要分析:
算法????
我会告诉你除了模拟之外就没了么????
写模拟的时候用点平时从来不用的语法感觉很爽啊......虚基类......继承......多态......
代码实现:
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 }