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. js 将时间戳转为日期格式

    最近项目需要在前端将一个13位的时间戳显示成日期格式,在网上查了很多都不符合要求,只有一个是能满足要求的,在这记录一下,说不定以后还用的着. 13位时间戳改为yyyy-MM-dd HH-mm-ss 格 ...

  2. Day_04-数组,元组,列表

    # for i in range(5): # for j in range(5): # print(i,j) # import re # def rm(): # a = ' 1 2 3 4 5 ' # ...

  3. 跳马(Knight Moves), ZOJ1091, POJ2243 x

    跳马(Knight Moves), ZOJ1091, POJ2243 题目描述: 给定象棋棋盘上两个位置 a 和 b,编写程序,计算马从位置 a 跳到位置 b 所需步数的最小值. 输入描述: 输入文件 ...

  4. Leetcode 8. String to Integer (atoi)(模拟题,水)

    8. String to Integer (atoi) Medium Implement atoi which converts a string to an integer. The functio ...

  5. 小程序封装wx.request,以及调用

    1.新建一个api目录,与pages同级 2.在api目录下新建一个api.js文件 3.编写代码 const host = 'http://test.test.cn' const wxRequest ...

  6. C++中一些容易迷惑的语法点总结

    #include<iostream> #include<cstring> using namespace std; int main(){ ][]={{,,},{,,}}; ] ...

  7. 小白的git克隆流程clone

    首先你进去你要存放代码的位置,比如将代码存放到D盘,然后在D盘中右键,点击Git Bash Here,就是说本地仓库要在D盘建立. 然后出现git 命令行界面,然后输入命令:git clone + 远 ...

  8. K-th occurrence HDU - 6704 (后缀数组+二分线段树+主席树)

    大意: 给定串s, q个询问(l,r,k), 求子串s[l,r]的第kk次出现位置. 这是一篇很好的题解: https://blog.csdn.net/sdauguanweihong/article/ ...

  9. postgresql_action

    SELECT * FROM x123_area a LEFT JOIN x123_user_task_brief utb ON utb.ref_area_code = a.area_code WHER ...

  10. JMeterContext----上下文

    http://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterContext.html org.apache.jmeter.threads ...