您的位置:首页 > 其它

BZOJ2548 [CTSC2002] 灭鼠行动

2016-01-27 18:29 686 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2548

Description

最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠。下水道只有东西方向和南北方向的管道,如图所示。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define rep(i,l,r) for(int i=l; i<=r; i++)
#define clr(x,y) memset(x,y,sizeof(x))
using namespace std;
const int maxn = 60;
const int bin[4] = {1,2,4,8};
const int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
inline int read(){
int ans = 0, f = 1;
char c = getchar();
for(; !isdigit(c); c = getchar())
if (c == '-') f = -1;
for(; isdigit(c); c = getchar())
ans = ans * 10 + c - '0';
return ans * f;
}
struct Mouse{
int x,y,dir,grow,frez,time,breed;
bool sex,dead;
}m[110];
struct Weapon{
int x,y,type,time;
}w[110];
int L,R,M,n,P,K,head=0,cur,limit,Time,c[maxn][maxn],num[maxn][maxn];
bool mark[maxn][maxn];
char ch[10];
inline double getdis(int x1,int y1,int x2,int y2){
return sqrt((x1-x2) * (x1-x2) + (y1-y2) * (y1-y2));
}
inline void flush(){
int cnt = 0;
rep(i,1,K) if (!m[i].dead) m[++cnt] = m[i];
K = cnt;
}
void expose(){
rep(p,1,P){
Weapon now = w[p];
if (now.time == cur)
switch(now.type){
case 1:
clr(mark,0); mark[now.x][now.y] = 1;
rep(i,0,3){
int nowx = now.x, nowy = now.y, dis = 0;
while (c[nowx][nowy] & bin[i]){
nowx += dir[i][0]; nowy += dir[i][1]; dis++;
if (dis > L) break;
mark[nowx][nowy] = 1;
}
}
rep(i,1,K){
if (mark[m[i].x][m[i].y]) m[i].dead = 1;
}
break;
case 2:
rep(i,1,K){
if (getdis(now.x,now.y,m[i].x,m[i].y) <= R){
m[i].frez += 3;
if (m[i].breed > cur) m[i].breed += 3;
}
}
break;
case 3:
rep(i,1,K)
if (m[i].x == now.x && m[i].y == now.y)
m[i].dead = 1;
break;
case 4:
rep(i,1,K)
if (m[i].x == now.x && m[i].y == now.y)
m[i].sex ^= 1;
break;
}
}
}
void breed(){
flush();
clr(num,0);
rep(i,1,K) num[m[i].x][m[i].y]++;
rep(i,1,K){
if (!m[i].grow && !m[i].frez && m[i].breed == -1 && !m[i].sex && num[m[i].x][m[i].y] == 2){
rep(j,1,K) if (!m[j].grow && !m[j].frez && m[j].sex && m[j].x == m[i].x && m[j].y == m[i].y){
m[i].frez += 3; m[j].frez += 3;
m[i].breed = m[j].breed = cur + 2;
break;
}
}
}
rep(i,1,K){
if (m[i].breed == cur && m[i].sex){
rep(j,0,3){
if (bin[j] & c[m[i].x][m[i].y]){
K++; m[K].x = m[i].x; m[K].y = m[i].y;
m[K].frez = m[K].time = m[K].dead = 0;
m[K].dir = j; m[K].grow = 5; m[K].breed = -1;
if (j == 0 || j == 2) m[K].sex = 0; else m[K].sex = 1;
}
}
}
}
}
void move(Mouse &x){
x.breed = -1; int now = c[x.x][x.y];
if (now & bin[x.dir]){
x.x += dir[x.dir][0]; x.y += dir[x.dir][1];
return;
}
int r = (x.dir + 1) % 4, l = (x.dir + 3) % 4, b = (x.dir + 2) % 4;
if (now & bin[b]) now -= bin[b];
if (!now){
x.dir = r; return;
}
if (now == bin[l]) x.dir = l;
else if (now == bin[r]) x.dir = r;
else{
x.time++;
if (x.time & 1) x.dir = l;
else x.dir = r;
}
}
int main(){
L = read(); R = read(); M = read(); n = read();
rep(i,1,M) rep(j,1,n) c[i][j] = read();
K = read();
rep(i,1,K){
m[i].x = read(); m[i].y = read();
scanf("%s",ch);
if (ch[0] == 'N') m[i].dir = 0; else if (ch[0] == 'E') m[i].dir = 1;
else if (ch[0] == 'S') m[i].dir = 2; else if (ch[0] == 'W') m[i].dir = 3;
scanf("%s",ch); m[i].sex = (ch[0] == 'Y');
m[i].breed = -1;
}
P = read(); limit = read();
rep(i,1,P){
w[i].type = read(); w[i].time = read(); w[i].x = read(); w[i].y = read();
if (w[i].type == 3) w[i].time += 3;
}
Time = read();
for(cur=0; cur<=Time; cur++){
expose();
breed();
if (K > limit){
printf("-1\n"); return 0;
}
if (cur != Time){
rep(i,1,K)
if (m[i].frez) m[i].frez--;
else{
move(m[i]);
if (m[i].grow) m[i].grow--;
}
}
}
printf("%d\n",K);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: