BZOJ2548 [CTSC2002] 灭鼠行动
2016-01-27 18:29
686 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2548
View Code
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
相关文章推荐
- JAVA复习
- SEO原创文章制作器
- NSNotificationCenter 用法注意点
- hadoop 2.6.0 CorruptReplicasMap源代码分析
- NLB+Application Request Route 网路负载均衡
- S-Docker_01_基础理论知识
- 文章标题
- main.xml
- C语言实现均匀分布随机函数
- poj_2418 Hardwood Species (字典序Trie树)
- iOS 隐藏状态栏
- MUI - 图片预览(perviewimage)的优化
- 多线程问题
- scrapy 中文教程
- 布局Animation
- android studio真机调试offline的问题
- perforce使用心得
- JAVA的整型与字符串相互转换
- Linux nexus 搭建私服和安装索引
- 动画浅析-CAAnimation和CATransition