题目描述

传送门

题解

又是一道大模拟。。。
需要注意的几个地方:
1、一个时刻x+时间单位x~y操作的顺序是:时刻x老鼠繁殖、时刻x放武器、判断是否发生鼠疫、时间单位x~y老鼠移动。
2、只有某一个点上有且仅有两只老鼠并且满足性别互异、均成年、不在上一次繁殖期间或者昏迷状态下才可以繁殖。
3、某一次繁殖结束之后(等待+繁殖+休息),如果两只老鼠又进行了一次操作(走一步或者转一下方向),并且又同时到了同一个点上,那么它们可以接着繁殖。
4、在昏迷过程中,所有的生理活动都被暂停,包括:年龄增长、繁殖或休息的时间。
5、在繁殖过程中(等待+繁殖+休息)都不能移动。

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;int n,m,L,R,P,limit,T,now;
bool plague;
struct RAT
{// 当前位置int x,y;// 朝向 0 上 1 右 2 下 3 左 int dir; // 性别 0 雄性 1 雌性 int sex;// 年龄int age;// 还需要再等待re时间才能恢复生理活动 int re;// 第几次遇到两边都有路的情况int cnt;// 还需要再等待multi时间才能生出小老鼠,若multi=-1则并没有进行繁殖 int multi;// 还需要再等待move时间才能运动(繁殖之后),若move=-1说明并不是繁殖刚结束,可以接着繁殖 int move; // 是否已经死亡 1 死亡 bool dead;
}rat[405],bag[405];
struct GUN
{// 武器的类型 1 强力炸弹 2 神秘射线 3 定时炸弹 4 生物炸弹 int type;// 放置的时间int t;// 放置的位置int x,y;bool operator < (const GUN &a) const{return t<a.t;}
}gun[105];
// 目前的老鼠总数
int tot;
// 下水道中每一个位置的结构
int loc[55][55];
// 方向转化为二进制数
int trans[4]={1,2,4,8};
// 四种走法
int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};
// 判断每一个位置是否被当前的强力炸弹攻击到
bool vis[55][55];
// 当前时刻下水道中每一个位置存在的老鼠集合、大小
int s[55][55][405],size[55][55];void Multi()
{memset(size,0,sizeof(size));// 统计每一个点有多少只老鼠 for (int i=1;i<=tot;++i){int x=rat[i].x,y=rat[i].y;s[x][y][++size[x][y]]=i;}for (int i=1;i<=n;++i)for (int j=1;j<=m;++j)// 如果某一个点只有两只老鼠 if (size[i][j]==2){int id=s[i][j][1],jd=s[i][j][2];// 性别互异 if (rat[id].sex==rat[jd].sex) continue;// 成年 if (rat[id].age<5||rat[jd].age<5) continue;// 如果未恢复生理活动if (rat[id].re||rat[jd].re) continue; // 如果在生育过程中 if (rat[id].multi!=-1||rat[jd].multi!=-1) continue;// 如果在休息过程中if (rat[id].move!=-1||rat[jd].move!=-1) continue; rat[id].multi=rat[jd].multi=2;}for (int i=1;i<=tot;++i){// 如果 未恢复生理活动 或者 在休息过程中 if (rat[i].re||rat[i].move!=-1) continue;// 如果现在要生小老鼠 if (!rat[i].multi){rat[i].move=1;rat[i].multi=-1;// 两个性别只处理一个 if (rat[i].sex) continue;int x=rat[i].x,y=rat[i].y;for (int j=0;j<4;++j)if (loc[x][y]&trans[j]){++tot;rat[tot].x=x,rat[tot].y=y;rat[tot].dir=j;// 南北是雄性,东西是雌性 if (j&1) rat[tot].sex=1;else rat[tot].sex=0;rat[tot].age=rat[tot].cnt=rat[tot].dead=rat[tot].re=0;rat[tot].multi=rat[tot].move=-1;}}}
}
int Dis(RAT a,GUN b)
{return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
void Attack(GUN now)
{switch (now.type){// 强力炸弹 case 1:{memset(vis,0,sizeof(vis));int x,y,cnt;x=now.x,y=now.y;cnt=0;vis[x][y]=1;while ((loc[x][y]&1)&&cnt<L){--x;++cnt;vis[x][y]=1;}x=now.x,y=now.y;cnt=0;while ((loc[x][y]&2)&&cnt<L){++y;++cnt;vis[x][y]=1; }x=now.x,y=now.y;cnt=0;while ((loc[x][y]&4)&&cnt<L){++x;++cnt;vis[x][y]=1; }x=now.x,y=now.y;cnt=0;while ((loc[x][y]&8)&&cnt<L){--y;++cnt;vis[x][y]=1; }for (int i=1;i<=tot;++i)if (vis[rat[i].x][rat[i].y])rat[i].dead=1;break;}// 神秘射线 case 2:{for (int i=1;i<=tot;++i)if (!rat[i].dead&&Dis(rat[i],now)<=R*R)rat[i].re+=3;break;}// 定时炸弹 case 3:{for (int i=1;i<=tot;++i)if (rat[i].x==now.x&&rat[i].y==now.y)rat[i].dead=1;break;}// 生物炸弹 case 4:{for (int i=1;i<=tot;++i)if (rat[i].x==now.x&&rat[i].y==now.y)rat[i].sex^=1;break;}}
}
void CheckDeath()
{int now=0;for (int i=1;i<=tot;++i)if (!rat[i].dead) bag[++now]=rat[i];tot=now;for (int i=1;i<=tot;++i) rat[i]=bag[i];
}
void Move()
{for (int i=1;i<=tot;++i){// 如果 未恢复生理活动 或者 处于繁殖完的休息 或者 在繁殖中 都不能移动 if (rat[i].re||rat[i].move>0||rat[i].multi!=-1) continue;int x=rat[i].x,y=rat[i].y;int d=rat[i].dir,dl=(d-1+4)%4,dr=(d+1)%4,db=(d+2)%4;// 只要前方有管道 if (loc[x][y]&trans[d]){rat[i].x=x+dx[d],rat[i].y=y+dy[d];continue;}// 两边都有路 if ((loc[x][y]&trans[dl])&&(loc[x][y]&trans[dr])){++rat[i].cnt;if (rat[i].cnt&1) rat[i].dir=dl;else rat[i].dir=dr;continue;}// 左边有管道右边无管道 if ((loc[x][y]&trans[dl])&&((loc[x][y]&trans[dr])==0)){rat[i].dir=dl;continue;}// 右边有管道左边无管道 if ((loc[x][y]&trans[dr])&&((loc[x][y]&trans[dl])==0)){rat[i].dir=dr;continue;}// 死路 向右转 rat[i].dir=dr;}
}
void Arrange()
{for (int i=1;i<=tot;++i){if (!rat[i].re) ++rat[i].age;if (!rat[i].re&&rat[i].multi!=-1) --rat[i].multi;if (!rat[i].re&&rat[i].move!=-1) --rat[i].move;if (rat[i].re) --rat[i].re;}
}
int main()
{scanf("%d%d%d%d",&L,&R,&n,&m);for (int i=1;i<=n;++i)for (int j=1;j<=m;++j) scanf("%d",&loc[i][j]);scanf("%d\n",&tot);for (int i=1;i<=tot;++i){char c1,c2;scanf("%d %d %c %c\n",&rat[i].x,&rat[i].y,&c1,&c2);switch (c1){case 'N':rat[i].dir=0;break;case 'E':rat[i].dir=1;break;case 'S':rat[i].dir=2;break;case 'W':rat[i].dir=3;break;}if (c2=='X') rat[i].sex=0;else rat[i].sex=1;rat[i].cnt=rat[i].re=rat[i].dead=0; rat[i].multi=rat[i].move=-1;rat[i].age=5; }scanf("%d%d",&P,&limit);for (int i=1;i<=P;++i){scanf("%d%d%d%d",&gun[i].type,&gun[i].t,&gun[i].x,&gun[i].y);if (gun[i].type==3) gun[i].t+=3;}sort(gun+1,gun+P+1);scanf("%d",&T);now=1; for (int i=0;i<=T;++i){// start the second// 老鼠进行繁殖Multi();// 放置武器,攻击老鼠while (now<=P&&gun[now].t<=i){Attack(gun[now]);++now;}CheckDeath();if (tot>limit){plague=1;break;}// 老鼠进行移动Move();// end the secondArrange();}if (plague) puts("-1");else printf("%d\n",tot);
}

[BZOJ2548][Ctsc2002]灭鼠行动(大模拟)相关推荐

  1. BZOJ2548:[CTSC2002]灭鼠行动

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  2. bzoj2548[Cstc2002]灭鼠行动

    Description 最近,有一些繁殖力很强的老鼠在下水道非常猖獗,灭鼠特工队正在计划消灭这些老鼠.下水道只有东西方向和南北方向的管道,如图所示. 灭鼠特工队的队员拥有强大的武器.他们将在某些时刻t ...

  3. 1014 Waiting in Line (30 分) 【未完成】【难度: 难 / 知识点: 大模拟】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805498207911936 大模拟代码有时间补

  4. ZOJ 3879(大模拟)

    传送门 题面:Capture the Flag Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge In comp ...

  5. ccf 202012-3 带配额的文件系统(大模拟)

    题外: 啊这,大半年没来csdn了,都长草了.回来练练机试内容吧,现在敲个模拟题,磕磕绊绊的..但是这大模拟恶心也是真恶心... 思路: 开始的时候跑偏了,本来是用的邻接表直接建边,但是问题是不在同一 ...

  6. “景驰科技杯”2018年华南理工大学程序设计竞赛 C Youhane's Undergraduate Thesis (大模拟)

    链接:https://www.nowcoder.com/acm/contest/94/C 大家都知道想从华南理工大学的本科毕业并不是一件简单的事情,作为一名大四即将毕业的学生,优酱正在为她的毕业论文愁 ...

  7. 20201104大模拟(一)

    20201104大模拟(一) 开错题了我吐了,赛后A一发过,绝了 B是什么deng西,我得有一段时间不想看到植物大战僵尸了,有一些边界问题 C是在计算的过程中的大模拟 D是思维, 总体来说其实还好,不 ...

  8. 【第一届INT杯】 INT lpy的火柴游戏(大模拟)

    题目链接:https://www.coder.ac.cn/problem/INT1005 题解:这里就不多说了,也没有答案,没有数据.下午想了挺久的,总还是有一点收获的. 总结收获: 1.大模拟轻易别 ...

  9. [BZOJ1033][ZJOI2008]杀蚂蚁antbuster(大模拟)

    题目描述 传送门 题解 bz的题面真心不爽,建议去codevs 比较良心的一道大模拟,题面写的比较清楚,也没有什么坑 几个需要注意的地方 1.对于每一只蚂蚁来说,年龄=秒数-1 2.选择方向的过程是: ...

最新文章

  1. web前端入门学习 css(7)css高级技巧 (精灵图、字体图标、css三角、鼠标样式、表单轮廓线、文本框拖拽、垂直对齐、图底空白缝隙、margin负值、溢出文字省略号、文字环绕、css初始化)
  2. excel随机抽取_简单随机抽样及其进阶分层随机抽样方法展示
  3. abp的权限与导航菜单的关系
  4. python安装sklearn_让机器学习自动帮我们建模,这4个Python库能让你大开眼界!
  5. 赛锐信息:SAP ABAP 概述
  6. html怎么添加背景图片_万能的产品介绍PPT页面是怎么炼成的?
  7. 【转】JSch - Java实现的SFTP(文件下载详解篇)
  8. ubuntu16.04上阅读CAJ格式的文件
  9. java轮训算法_轮询算法 - 小虾米的java梦 - 博客园
  10. matlab读取wav文件出错,MATLAB读取wav文件
  11. 【官方文档】Fluent Bit 数据管道之输入插件(Tail)
  12. 为什么别人进步你退步,你应该如何提升自己
  13. mysql之关联更新(update join,用b表更新a表记录)
  14. 算法的数值稳定性实验报告用c语言,数值计算实验教案.doc
  15. 说一说 Backscatter communication
  16. 用python做PDF本地化压缩,新增多进程
  17. Prolific PL2303 usb 转串口Win8 Win8.1驱动
  18. 亲测,解决windows通过ssh访问ubantu失败的问题
  19. SpringBoot项目--如何不停服更新应用?
  20. 音频(一) - 音频基础知识

热门文章

  1. 毛毛雨的博客乐园—内容简介
  2. 鸿蒙王者荣耀想要转区吗,王者荣耀账号怎么转区 角色迁移转区教程
  3. 通过图形界面对MySQL数据库进行操作
  4. 【在线学习站点汇总】
  5. OpenStack云平台搭建
  6. vue两个按钮切换_vue点击循环 添加列表 点击来回切换
  7. 如何评价《Big Data:大数据时代》这本书?
  8. 蹲175年的号子?维基解密阿桑奇动了谁的奶酪?
  9. 数影周报:程序员离职后锁公司硬盘;Salesforce 遭遇高管离职潮
  10. 无lnternet_无internet访问,详细教您怎么解决无internet访问