P2586 [ZJOI2008]杀蚂蚁

大模拟。

什么都不想补了。

看变量名感性理解吧

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef double db;
int n,m,t,s,d,gg,taken; db r;
int R,mes[][],vis[][],target;
db hp_up=; int lev_up,tt;
struct Poi{
int x,y;
Poi(int A=,int B=):x(A),y(B){}
Poi operator + (Poi &G){return Poi(x+G.x,y+G.y);}
Poi operator - (Poi &G){return Poi(x-G.x,y-G.y);}
bool operator != (Poi &G){return x!=G.x||y!=G.y;}
bool in(){return x>=&&x<=n&&y>=&&y<=m;}
void print(){printf("%d %d\n",x,y);}
}b[];
Poi di[]={Poi(,),Poi(,),Poi(,-),Poi(-,)};
struct ant{
int age,hp,lim,lev,cake; Poi id,ls;
void born(){hp=lim=*hp_up,lev=lev_up,age=,id=ls=Poi(,);cake=;}
void print(){printf("%d %d %d %d %d\n",age,lev,hp,id.x,id.y);}
}a[];
int dcmp(db x){return fabs(x)<1e-?:(x>?:-);}
db Dot(Poi A,Poi B){return A.x*B.x+A.y*B.y;}
db Cross(Poi A,Poi B){return A.x*B.y-A.y*B.x;}
db dis(Poi A){return sqrt(Dot(A,A));}
db dis2(Poi A,Poi B,Poi C){
Poi v1=A-B,v2=C-B,v3=A-C;
if(dcmp(Dot(v1,v2))<) return dis(v2);
if(dcmp(Dot(v2,v3))<) return dis(v3);
return fabs(Cross(v1,v3))/dis(v1);
}
void born(){if(tt%==) hp_up*=1.1,++lev_up; ++tt;a[++R].born();vis[][]=;}
void remain(int i){mes[a[i].id.x][a[i].id.y]+=a[i].cake?:;}
#define to (a[i].id+di[j])
void take(int i){
if(a[i].id.x==n&&a[i].id.y==m&&!taken)
taken=,a[i].hp=min(a[i].lim,a[i].hp+a[i].lim/),a[i].cake=;
}
void move(int i){
bool nx=,same=; int me[],mx=-,dir=;
for(int j=;j<;++j) if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls){
me[j]=mes[to.x][to.y];
if(me[j]>mx) mx=me[j],dir=j,same=;
else if(me[j]==mx) same=;
}
if(mx==-) {a[i].ls=a[i].id;take(i);return ;}
vis[a[i].id.x][a[i].id.y]=;
if(same){
for(int j=;j<;++j)
if(mx==me[j]&&to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
{dir=j; break;}
}
if(a[i].age%==){
for(int j=dir-;nx&&j>=;--j)
if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
nx=,dir=j;
for(int j=;nx&&j>=dir;--j)
if(to.in()&&!vis[to.x][to.y]&&to!=a[i].ls)
nx=,dir=j;
}
a[i].ls=a[i].id; a[i].id=a[i].id+di[dir];
vis[a[i].id.x][a[i].id.y]=; take(i);
}
void over(int i){
if(a[i].id.x==&&a[i].id.y==&&a[i].cake){gg=; return;}
}
void shoot(int i){
db len=dis(b[i]-a[target].id);
if(taken&&len<=r){
for(int j=;j<=R;++j)
if(j==target||dis2(b[i],a[target].id,a[j].id)<=0.5)
a[j].hp-=d;
}else{
db mn=r; int ad=-;
for(int j=R;j>=;--j){
len=dis(b[i]-a[j].id);
if(len<=mn) mn=len,ad=j;
}
if(ad>) a[ad].hp-=d;
}
}
void check(int i){
if(a[i].hp<){
if(a[i].cake) taken=;
vis[a[i].id.x][a[i].id.y]=;
for(int j=i;j<=R;++j) a[j]=a[j+];
--R;
}else ++a[i].age;
}
void disappear(){
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
if(mes[i][j]) --mes[i][j];
}
int main(){
scanf("%d%d%d%d%lf",&n,&m,&s,&d,&r);
for(int i=;i<=s;++i)
scanf("%d%d",&b[i].x,&b[i].y),vis[b[i].x][b[i].y]=;
scanf("%d",&t);
for(int i=,j;i<=t;++i){
if(!vis[][]&&R<) born();
for(j=;j<=R;++j) remain(j);
for(j=;j<=R;++j) move(j);
for(j=;j<=R;++j) if(a[j].cake) taken=,target=j;
for(j=;j<=s;++j) shoot(j);
for(j=R;j;--j) check(j);
for(j=;j<=R;++j) over(j);
if(gg){printf("Game over after %d seconds\n",i); break;}
disappear();
}
if(!gg) puts("The game is going on");
printf("%d\n",R);
for(int i=;i<=R;++i) a[i].age-=+gg,a[i].print();
return ;
}

P2586 [ZJOI2008]杀蚂蚁(模拟)的更多相关文章

  1. Luogu2586 [ZJOI2008]杀蚂蚁 ---- 模拟

    Luogu2586 [ZJOI2008]杀蚂蚁 题意 还是一道大模拟 https://www.luogu.org/problemnew/show/P2586 大概就是炮塔大蚂蚁的故事 下载这个游戏ht ...

  2. P2586 [ZJOI2008]杀蚂蚁

    传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...

  3. [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster

    1033: [ZJOI2008]杀蚂蚁antbuster Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1200  Solved: 507[Submi ...

  4. [ZJOI2008]杀蚂蚁antbuster

    [ZJOI2008]杀蚂蚁antbuster 题目 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试 ...

  5. BZOJ1033:[ZJOI2008]杀蚂蚁antbuster(模拟)

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右 下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的 ...

  6. 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

  7. bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster

    http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...

  8. [bzoj1033] [ZJOI2008]杀蚂蚁antbuster

    Description 最近,佳佳迷上了一款好玩的小游戏:antbuster.游戏规则非常简单:在一张地图上,左上角是蚂蚁窝,右下角是蛋糕,蚂蚁会源源不断地从窝里爬出来,试图把蛋糕搬回蚂蚁窝.而你的任 ...

  9. BZOJ1033:[ZJOI2008]杀蚂蚁

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

随机推荐

  1. Python---Tkinter---计算器

    Python---Tkinter---计算器 - 模拟系统的计算器功能 - 实现一个简单的具有加减法等操作的计算器 - 使用tkinter - 操作步骤 - 画GUI - 给每个控件配置相应的事件 - ...

  2. 【leetcode】K-th Symbol in Grammar

    题目如下: 解题思路:直接把每行的数据计算出来肯定是不行的,因为N最大是30,那个第N行长度就是2^30次方,这显然不可取.那么就只能找规律了,我采取的是倒推法.例如假如我们要求出第四行第七个元素的值 ...

  3. CDMA原理

    CDMA原理——特点 CDMA具有抗多径干扰.抗窄带干扰.抗认为干扰.抗多径延迟扩展的能力.同时有提高蜂窝系统的通信容量和便于模拟与数字体制的共存与过渡等优点.与TDMA技术形成强劲的竞争力. 与FD ...

  4. Shell入门02

    Shell入门-02 1.重定向 标准输入(<) 标准输出 标准错误重回定向 程序 = 指令 + 数据 命令   变量 在程序中,数据如何输入?又如何输出? 数据输入:键盘 – 标准输入,但是并 ...

  5. RMI实现方案

  6. Java——类的继承、访问控制

    [继承] <1>Java只支持单继承,不支持多继承. <2>继承父类的私有成员变量,只有所有权,没有使用权.   [继承中的构造方法]

  7. Gradle教程-w3cschool

    Gradle,这是一个基于 JVM 的富有突破性构建工具.Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目.本教程主要讲解了如何使用 Gradle 构建系 ...

  8. CG-CTF | 综合题

    开场就是一个js混淆,直接丢到console里面 然后根据tip查头: 看到这个tip,一开始还以为要考注入了,用访问历史来进行注入,后来发现是我高估这题了,,,:

  9. Codeforce |Educational Codeforces Round 77 (Rated for Div. 2) B. Obtain Two Zeroes

    B. Obtain Two Zeroes time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. Linux下" >/dev/null 2>&1 "详解

    在学习Linux的过程中,常会看到一些终端命令或者程序中有">/dev/null 2>&1 "出现,由于已经遇到了好几次了,为了理解清楚,不妨花点时间百度或者g ...