Description

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

灭鼠特工队的队员拥有强大的武器。他们将在某些时刻t在某些位置(x,y)放置武器。他们所使用的武器包括:
1. 强力炸弹:它的攻击范围限定在管道内部,是沿竖直和水平方向,离(x,y)的距离不超过L的区域,但是不能穿透下水道壁。它将在放置之后立刻爆炸,且攻击范围内的老鼠将被全部炸死。
2. 神秘射线:它的攻击范围是以(x,y)为圆心,半径为R的圆,而且可以穿透下水道壁。射线在时刻t施放后,将使攻击范围内的所有老鼠立刻陷入昏迷状态,失去知觉,停止一切生理活动,待到第t+3时刻才能恢复(保持失去知觉前的朝向)。如果在昏迷状态中再次受到射线攻击,那么它将再推迟3个时刻恢复。例如,若老鼠在时刻t和时刻t+1个受到一次射线的攻击,则它要昏迷到第t+3+3时刻才能恢复知觉。恢复知觉以后,老鼠将继续以前的生理活动。
3. 定时炸弹:它的攻击范围仅包括(x,y)。它在时刻t放置后,将在第t+3时刻爆炸,爆炸时处在(x,y)点的老鼠将全部被炸死。
4. 生物炸弹:它的攻击范围仅包括(x,y)。它将在放置之后立刻爆炸,使处在(x,y)点的所有老鼠的性别改变(无论大小,雌变成雄,雄变成雌),但不影响老鼠的正常生理活动。
虽然特工队的实力很强,但是老鼠的实力也不容忽视。
我们定义,相邻两个时刻之间是一个时间单位。从t=0时刻开始,每只老鼠就从初始位置向某一初始方向运动。只要前方有管道,如上图中沿方向N到达点A,老鼠就会一直向前走,运动速度为1。否则,如果只有左边或者只有右边有管道,如上图中沿方向E到达点B时,再不能沿原方向继续前进,它就会花费一个时间单位朝该方向原地转动90度,即它将改变方向朝向S。如果它左边和右边都有管道,如上图中沿方向W到达点C,老鼠会回忆这是第几次处于这种情况。如果是第奇数次遇到,它会向左转,第偶数次就向右转。如果它处于一条死路的尽头,如上图中沿方向W到达点D,那么它会花费两个时间单位连续向右转两次,即它将改变方向朝向E。
如果在t时刻某点恰好只有两只老鼠,一只为成年雄老鼠,一只为成年雌老鼠,则它们将会因为进行繁殖而在该点停留两个单位时间,t+2时刻会在该点对每个有管道的方向生出一只朝着该方向的小老鼠,南北方向为雄小老鼠,东西方向为雌小老鼠。如上图中的C点,t时刻恰好只有两只老鼠,它们都已成年且性别相异,那么在第t+2时刻就会在该点生出三只小老鼠,它们分别朝向N、S、E,性别分别是雄性、雄性、雌性。小老鼠一出生就立刻开始移动,而成年老鼠需要再休息一个时间单位,即在t+3时刻继续活动(两只老鼠都保持生育前的朝向)。小老鼠需要成长5个时间单位才会长成为成年老鼠。
特工队现在制定了一套灭鼠计划,其中包括在下水管道放置武器的位置、时间和类型。你需要帮他们计算灭鼠行动的效果,如果在该计划实施的过程中,老鼠的数量超过了某个限定值,就会爆发鼠疫。

Input

第一行为4个整数L R m n(0<=L,R<=10,1<=m,n<=50),其中L代表强力炸弹的有效攻击距离,R代表神秘射线的作用半径,m和n代表下水道平面图的规模。x坐标的范围为[1,m], y坐标的范围为[1,n]。
从第2行到第m+1行为下水道结构图。我们用方向数1代表N(北),用方向数2代表E(东),用方向数4代表S(南),用方向数8代表W(西)。第i+1行的第j个数字ci,j代表点(i,j)处有管道连接的所有方向数之和,如上图中的点B的方向数之和为12。
第m+2行为一个整数K(1<=K<=50),代表时刻0时老鼠的个数(此时老鼠都是成年的)。
第m+3行到第m+K+2行每行描述一只老鼠,包括该老鼠的初始坐标(x,y) (1<=x<=m, 1<=y<=n),朝向(’E’,’S’,’W’,’N’)以及性别(’X’=雄,’Y’=雌)。输入保证每个老鼠都在水管内。
第m+K+3行为两个整数P,Limit(1<=P, Limit<=100),分别表示特工队准备使用的武器个数以及控制鼠疫发生的老鼠数量的极限。
第m+K+4行到第m+K+P+3行每行描述一个武器,包括该武器的类型(1-强力炸弹,2-神秘射线,3-定时炸弹,4-生物炸弹),放置的时刻t(t>=1),放置的坐标(x,y) (1<=x<=m, 1<=y<=n),输入保证武器放置在管道内。武器按照放置的时间不降序排列。
最后一行包含一个整数Time(1<=Time<=1000),表示模拟的结束时刻。Time保证比所有武器的放置时刻大。

Output

包含一个整数。如果爆发了鼠疫,该整数为-1,否则该整数为时刻Time的老鼠数目。

Sample Input

1 1 3 3

6 14 12

7 15 13

3 11 9

3

1 3 W X

1 2 W X

3 3 S X

3 100

1 1 2 2

3 1 3 1

2 2 3 2

10

Sample Output

1

Source

2012国家集训队Round 1 day3

思路

这个国家集训队的模拟太坑了。。。表示长到不想做。。。

用结构体保存老鼠的性别,方向,位置xy,成长度,是否死亡,繁殖的时间,还需等待的时间,第几次遇见分岔路口。

用结构体保存炸弹的类型,位置xy,出现的时间。用一个队列记录下来所有的幸存老鼠,Num二维数组记录每个点上的老鼠数量(每次调用繁殖函数之前清零),map二维数组保存地图。

【炸弹与爆炸】
该什么时候爆炸,就什么时候爆炸。
对于炸弹一,用dfs遍历他的爆炸范围,然后,把范围内的老鼠的状态赋成死亡。
对于炸弹二,把范围内的老鼠的等待时间都+3,然后判断若是在“产后休息”,那就多休息3个时间点。
对于炸弹三,把这个点的所有老鼠状态标记为死亡。
对于炸弹四,把这个点的所有老鼠性别取反。

【主函数】
由于T<=1000,我们可以枚举每一个时间点,先爆炸,再繁殖(想想为什么)。如果泛滥了就输出“-1”,不然就针对每只活着的老鼠进行等待时间–,成长度++,然后移动,每个时间点统计老鼠总数。

【繁殖】
对于每两个老鼠,只要他们都成年,都是可活动状态,都在一个坐标且这个坐标没有别的老鼠,并且他们性别相反,那么就繁殖,并且相应改变等待时间。注意要两个时间才会出生。以上需在每个时间先处理出来,然后再两两枚举老鼠,若可以,就根据新老鼠加入的规则,在队列中加入一个未成年老鼠。

【活动】
Act函数是针对单个老鼠来的。如果这个老鼠是活的并且等待时间为0,那就移动。移动过程中若是有分岔路口,那么就看是第几次遇见,按照规则利用增量数组更新方向与位置。

【注意事项】
要非常机智的先处理炸弹,再处理繁殖,因为有可能某时刻出生的小老鼠被变性了。注意一下眩晕的老鼠不能开始繁殖,两只繁殖完的老鼠如果一次移动后仍然在一起且这个格子没有其他老鼠就可以繁殖,而不是两只在原地不停繁殖。

【吐槽】
要不是因为讲课,我才不做呢
我干嘛做这题啊。。NOIP绝对不可能考这种模拟,不然我吃键盘。

代码

200行。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=50+3;
const int K=100+5;
int change[4]={1,2,4,8};
int T,cur,L,R,M,n,tot,P,limit,c[N][N],num[N][N],flag[N][N],nowb;
int xx[4]={-1,0,1,0},yy[4]={0,1,0,-1};
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;
}
struct bomb
{int type;//类型 int x,y;//位置int t;//时间
}b[K];
bool cmp(bomb a,bomb b)
{return a.t<b.t;}
struct mouse
{int x,y;//位置 int dir;//方向 int grow;//成长度 int breed;//可否繁殖 int wait;//等待时间 int sex;//性别 int dead;//是否死亡int tim;//第几次遇到岔路
}m[K];
inline int sqr(int x)
{return x*x;}
void bomb1(bomb t)
{memset(flag,0,sizeof(flag));for (int i=0;i<4;i++){int nx=t.x,ny=t.y,l=0;flag[nx][ny]=1;while(c[nx][ny]&change[i]){nx=nx+xx[i],ny=ny+yy[i];l++;if (l>L) break;//距离不超过L flag[nx][ny]=1;}}for (int i=1;i<=tot;i++)if (flag[m[i].x][m[i].y]) m[i].dead=1;//炸到的地方有老鼠,就死了
}
void bomb2(bomb t)
{for (int i=1;i<=tot;i++){if (sqr(m[i].x-t.x)+sqr(m[i].y-t.y)<=R){m[i].wait+=3;if (m[i].breed>cur) m[i].breed+=3;//由于是分别判断,所以也要++ }}
}
void bomb3(bomb t)
{for (int i=1;i<=tot;i++)if (m[i].x==t.x&&m[i].y==t.y) m[i].dead=1;//杀了
}
void bomb4(bomb t)
{for (int i=1;i<=tot;i++)if (m[i].x==t.x&&m[i].y==t.y) m[i].sex^=1;//取反性别
}
void expose()
{bomb t=b[nowb+1];while(t.t==cur){nowb++;if (t.type==1) bomb1(t);if (t.type==2) bomb2(t);if (t.type==3) bomb3(t);if (t.type==4) bomb4(t);t=b[nowb+1];}
}
void act(mouse &t)
{t.breed=-1;int d=t.dir,now=c[t.x][t.y];if ((now&change[d])!=0){t.x+=xx[d];t.y+=yy[d];return ;}//转化二进制,前面有路 int l=(d+3)%4,r=(d+1)%4,b=(d+2)%4;if (now&change[b]) now-=change[b];if (now==change[l]) t.dir=l;else if (now==change[l]+change[r]){t.tim^=1;if (t.tim) t.dir=l;else t.dir=r;}else t.dir=r;
}
void breed()
{int top=0;for (int i=1;i<=tot;i++)if (!m[i].dead) m[++top]=m[i];//没死 tot=top;//更新总量 memset(num,0,sizeof(num));//清零,便于接下来更新 for (int i=1;i<=tot;i++)num[m[i].x][m[i].y]++;//更新 for (int i=1;i<=tot;i++)if (!m[i].wait&&m[i].breed==-1&&num[m[i].x][m[i].y]==2&&!m[i].sex&&!m[i].grow){for (int j=1;j<=tot;j++)if (!m[j].wait&&m[i].x==m[j].x&&m[i].y==m[j].y&&m[j].sex&&!m[j].grow){m[i].wait+=3;m[j].wait+=3;m[i].breed=cur+2;m[j].breed=cur+2;break;}}for (int i=1;i<=tot;i++)if (m[i].breed==cur&&m[i].sex){for (int k=0;k<4;k++)if (change[k]&c[m[i].x][m[i].y]){tot++;m[tot].x=m[i].x;m[tot].y=m[i].y;m[tot].dead=m[tot].tim=0;m[tot].dir=k;m[tot].wait=0;m[tot].breed=-1;m[tot].grow=5;if (k==0||k==2) m[tot].sex=0;else m[tot].sex=1;}   }
}
int main()
{char ch[5];L=read();R=read();M=read();n=read();R=R*R;for (int i=1;i<=M;i++)for (int j=1;j<=n;j++)c[i][j]=read();tot=read();for (int i=1;i<=tot;i++){m[i].x=read(),m[i].y=read();scanf("%s",ch);if (ch[0]=='N') m[i].dir=0;if(ch[0]=='E')m[i].dir=1;if (ch[0]=='S') m[i].dir=2;if(ch[0]=='W')m[i].dir=3;scanf("%s",ch);if (ch[0]=='Y') m[i].sex=1;m[i].breed=-1;}//老鼠信息 P=read();limit=read();for (int i=1;i<=P;i++){b[i].type=read();b[i].t=read();b[i].x=read();b[i].y=read();if (b[i].type==3) b[i].t+=3;}//炸弹信息 sort(b+1,b+P+1,cmp);T=read();for (cur=0;cur<=T;cur++){expose();//爆炸 breed();//繁殖 if (tot>limit) {puts("-1");return 0;}if (cur!=T){for (int i=1;i<=tot;i++){if (m[i].wait!=0) m[i].wait--;//还不能动 else {act(m[i]);//动 if (!m[i].wait&&m[i].grow) m[i].grow--;//相反的,成长度++ }}}   }printf("%d\n",tot);return 0;
}

(全网最详细!)bzoj 2548 灭鼠行动 模拟 解题报告相关推荐

  1. 全网最详细的HCNR200线性光耦模拟量隔离电路设计解析(看遍了网上抄来抄去的文章都没用,后来自己研究出来且仿真通过,在此给广大学子一个正确的导向)

    直接不扯其他的,不浪费大家时间,HCNR200就不介绍了,读者可以自行去看HCNR200的说明书技术手册.还请读者认真读完此篇博文,其中包含电路设计以及数据分析.电压偏差软件补偿等等部分. 英文说明书 ...

  2. [除草]BZOJ 2548 灭鼠计划

    题目大意: 很多武器, 很多老鼠, 模拟若干秒.(实际题意要麻烦很多) 简要分析: 算法???? 我会告诉你除了模拟之外就没了么???? 写模拟的时候用点平时从来不用的语法感觉很爽啊......虚基类 ...

  3. BZOJ 4710 [Jsoi2011]分特产 解题报告

    4710 [Jsoi2011]分特产 题意 给定\(n\)个集合,每个集合有相同的\(a_i\)个元素,不同的集合的元素不同.将所有的元素分给\(m\)个不同位置,要求每个位置至少有一个元素,求分配方 ...

  4. bzoj 2732 射箭 半平面交 解题报告

    Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一个位于( ...

  5. 赢在微点答案专区英语_高考英语怎么拿140+?全网最详细分阶段学习方法!

    作者介绍: 小胖学长,毕业于某省重点高中,在校期间英语单科多次排名年级前列.全国一卷高考英语145,现就读于西南政法大学. "在高中阶段所有学科中,英语是提分性价比最高的科目.只要你有付出, ...

  6. “是男人就下一百层”h5游戏全网最详细教学、全代码,js操作

    "是男人就下一百层"h5游戏全网最详细教学.全代码,js操作 博主的话 游戏展示 编程工具介绍 游戏代码 代码讲解 js 第一步 切换div的显示与隐藏 js 第二步 在菜单页面用 ...

  7. 全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解)

    全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解) 参考文章: (1)全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案 ...

  8. 全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)...

    不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 全网最详细的大数据集群 ...

  9. 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)

    全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解) 参考文章: (1)全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问 ...

最新文章

  1. DeepMind 的新强化学习系统,是迈向通用人工智能的一步吗?
  2. eclipse下tomcat配置
  3. Computer Browser服务不能启动
  4. 为什么 MySQL 回滚事务也会导致 ibd 文件增大?
  5. 综合缴费系统|综合缴费|话费充值
  6. weka 学习总结(持续)
  7. vb.net 判断是否为ip 正则_什么是个人IP科学定位?标准答案来了|ip|直播|科学|ip魔方...
  8. php mysql索引原理_加速PHP动态网站 关于MySQL索引分析优化
  9. 财务软件服务器装什么系统,财务软件用哪种云服务器
  10. Python爬取新笔趣阁小说
  11. python重启电脑
  12. 狂神Redis学习笔记(已更完)
  13. 流量贵?裂变营销或是低成本营销的最佳选择!
  14. Java 简易五子棋游戏的编写
  15. mysql-5.7.11-winx64_mysql 5.7.11 winx64安装配置教程
  16. 卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具Motrix!
  17. 使用Glade3.0进行界面开发
  18. 从双声道转单声道看语言/算法性能差异
  19. windows server 2012 r2 standard 通过堡垒机远程桌面服务器报错Remote Desktop Service CALs Request Failed
  20. 程序笔试题(涂鸦移动)

热门文章

  1. flutter nfc
  2. Lucene中倒排索引原理
  3. 排查线上问题的9种方式
  4. configure: error: libmpfr not found or uses a different ABI (including static vs shared)解决了
  5. 无人驾驶技术——Radar雷达
  6. Java 多线程 卖票
  7. Dropout Batch Normolization
  8. 大数据处理Spark:SparkStreaming--scala
  9. Windows mobile PPC 下利用 tmail.exe 发送短信、彩信、邮件
  10. Ubuntu/Window下X2Go安装连接同步/上传文件夹(一次性成功)