bzoj1033: [ZJOI2008]杀蚂蚁antbuster
2017-04-07 11:46
323 查看
传送门
炒鸡无敌大模拟。
就是打打太麻烦。
我不会给你讲我打错了game
炒鸡无敌大模拟。
就是打打太麻烦。
我不会给你讲我打错了game
#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,m,s,turd,r,T,born,getcake; int in[11][11],mp[11][11]; const int c[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; struct ant{ int lev,hp,age,x,y,lx,ly,mx; bool live,cake; }a[11]; struct point{int x,y;}tur[31]; struct line{point a,b;}l; point sub(point a,point b){ return (point){a.x-b.x,a.y-b.y}; } int cmul(point a,point b){ return a.x*b.y-a.y*b.x; } int turn(point a,point b,point c){ return cmul(sub(b,a),sub(c,a)); } int sqr(int x){ return x*x; } double dis(int x1,int y1,int x2,int y2){ return sqrt(sqr(x1-x2)+sqr(y1-y2)); } int dis2(int x,int y){ return sqr(tur[x].x-a[y].x)+sqr(tur[x].y-a[y].y); } double dis(int x,int y){ return sqrt(dis2(x,y)); } bool cmp(ant a,ant b){ return a.age>b.age; } void bornant(int k){ int l=born/6+1; a[k].lev=l; a[k].hp=a[k].mx=int(4*pow(1.1,l)); a[k].age=0; a[k].live=1; a[k].x=a[k].y=a[k].lx=a[k].ly=0; mp[0][0]=1; born++; } bool jud(int x,int y,int lx,int ly){ if (mp[x][y]||x<0||y<0||x>n||y>m) return 0; if (x==lx&&y==ly) return 0; return 1; } void move(int k,int dir){ int x=a[k].x,y=a[k].y; if (dir==-1){ a[k].lx=x; a[k].ly=y; return; } int nx=x+c[dir][0],ny=y+c[dir][1]; mp[x][y]=0; mp[nx][ny]=1; a[k].lx=x; a[k].ly=y; a[k].x=nx; a[k].y=ny; } void spmove(int k,int dir){ for (int i=(dir+3)%4;;i=(i+3)%4){ int nx=a[k].x+c[i][0]; int ny=a[k].y+c[i][1]; if (jud(nx,ny,a[k].lx,a[k].ly)){ move(k,i); return; } } } void premove(int k){ int x=a[k].x,y=a[k].y; int lx=a[k].lx,ly=a[k].ly; int mx=-0x3f3f3f3f,dir=-1; for (int i=0;i<4;i++){ int nx=x+c[i][0],ny=y+c[i][1]; if (jud(nx,ny,lx,ly)&&mx<in[nx][ny]) mx=in[nx][ny]; } for (int i=0;i<4;i++){ int nx=x+c[i][0],ny=y+c[i][1]; if (jud(nx,ny,lx,ly)&&mx==in[nx][ny]){ dir=i; break; } } if (a[k].age%5!=4||dir==-1) move(k,dir); else spmove(k,dir); } bool cross(int x,int y){ double d=dis(l.a.x,l.a.y,l.b.x,l.b.y); if (x==l.a.x&&y==l.a.y||x==l.b.x&&y==l.b.y) return 1; int x1=min(l.a.x,l.b.x),x2=max(l.a.x,l.b.x); int y1=min(l.a.y,l.b.y),y2=max(l.a.y,l.b.y); if (x<x1||x>x2||y<y1||y>y2) return 0; point p; p.x=x; p.y=y; if (fabs(turn(l.a,l.b,p))/d<=0.5) return 1; return 0; } void attack(int k){ int tmp=-1,dis=0x3f3f3f3f; for (int i=1;i<=6;i++) if (a[i].live){ int d=dis2(k,i); if (d<=r*r){ if (a[i].cake) tmp=i; else if (!a[tmp].cake&&d<dis){ dis=d; tmp=i; } } } if (tmp==-1) return; l.a=tur[k]; l.b.x=a[tmp].x; l.b.y=a[tmp].y; for (int i=1;i<=6;i++) if (a[i].live&&cross(a[i].x,a[i].y)) a[i].hp-=turd; } bool solve(int t){ if (!mp[0][0]) for (int i=1;i<=6;i++) if (!a[i].live){ bornant(i); break; } sort(a+1,a+7,cmp); for (int i=1;i<=6;i++) if (a[i].live){ int x=a[i].x,y=a[i].y; if (a[i].cake) in[x][y]+=5; else in[x][y]+=2; } for (int i=1;i<=6;i++) if (a[i].live) premove(i); if (!getcake) for (int i=1;i<=6;i++) if (a[i].live&&a[i].x==n&&a[i].y==m){ a[i].cake=getcake=1; a[i].hp=min(a[i].mx,a[i].hp+a[i].mx/2); } for (int i=1;i<=s;i++) attack(i); for (int i=1;i<=6;i++) if (a[i].live&&a[i].hp<0){ mp[a[i].x][a[i].y]=0; a[i].live=0; if (a[i].cake) a[i].cake=getcake=0; } if (getcake) for (int i=1;i<=6;i++) if (a[i].live&&a[i].cake&&a[i].x==0&&a[i].y==0) return 1; for (int i=0;i<=n;i++) for (int j=0;j<=m;j++) if (in[i][j]>0) in[i][j]--; for (int i=1;i<=6;i++) if (a[i].live) a[i].age++; return 0; } void init(){ scanf("%d%d",&n,&m); scanf("%d%d%d",&s,&turd,&r); for (int i=1;i<=s;i++){ scanf("%d%d",&tur[i].x,&tur[i].y); mp[tur[i].x][tur[i].y]=1; } scanf("%d",&T); } void print(){ int cot=0; sort(a+1,a+7,cmp); for (int i=1;i<=6;i++) if (a[i].live) cot++; printf("%d\n",cot); for (int i=1;i<=6;i++) if (a[i].live) printf("%d %d %d %d %d\n",a[i].age,a[i].lev,a[i].hp,a[i].x,a[i].y); } int main(){ init(); for (int i=1;i<=T;i++) if (solve(i)){ printf("Game over after %d seconds\n",i); print(); return 0; } printf("The game is going on\n"); print(); }
相关文章推荐
- bzoj1033 [ZJOI2008]杀蚂蚁antbuster
- 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster
- 模拟 [ZJOI2008]杀蚂蚁antbuster
- [BZOJ 1033] [ZJOI2008] 杀蚂蚁antbuster 【模拟!】
- [ZJOI2008]杀蚂蚁antbuster
- [BZOJ 1033][ZJOI2008]杀蚂蚁antbuster
- BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster(模拟)
- 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster
- 【模拟】【计算几何】[ZJOI2008][HYSBZ/BZOJ1033]杀蚂蚁antbuster
- BZOJ 1033 [ZJOI2008]杀蚂蚁antbuster 模拟
- bzoj1033: [ZJOI2008]杀蚂蚁antbuster
- 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】
- 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster(判断线段是否和圆相交)
- BZOJ 1033: [ZJOI2008]杀蚂蚁antbuster
- bzoj1033: [ZJOI2008]杀蚂蚁antbuster
- 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】
- 【BZOJ 1033】 [ZJOI2008]杀蚂蚁antbuster
- bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster
- [BZOJ1033][ZJOI2008]杀蚂蚁antbuster(大模拟)
- [ZJOI2008]杀蚂蚁 Solution