[bzoj1033]杀蚂蚁

Posted pywbktda

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[bzoj1033]杀蚂蚁相关的知识,希望对你有一定的参考价值。

这只是一道模拟题而已啊(大雾)
但是需要掌握一些简单的解析几何知识
个人觉得写结构体没什么必要啊,直接写过程就行了
主要是根据题目最后给出的顺序来做,有一下坑点:
1.只能存存在的蚂蚁,否则会tle(高攻击塔)
2.出生时间是年龄+1
3.game over了年龄不用+1
4.血量是先乘上4再取整
5.(0,0)有蚂蚁不生成
6.蚂蚁是一个半径0.5的圆
7.出生时间是5的倍数选择只考虑能否走
8.按蚂蚁出生顺序来移动
9.信息素只有大于0时才会-1
10.激光不会穿透
11.死亡要从后往前算

技术图片
  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define N 25
  4 #define sqr(x) ((x)*(x))
  5 struct ji
  6     int x,y;
  7     bool operator ==(const ji &a)const
  8         return (x==a.x)&&(y==a.y);
  9     
 10     bool operator !=(const ji &a)const
 11         return (x!=a.x)||(y!=a.y);
 12     
 13 ta[N],wei[N],pre[N];
 14 int n,m,s,d,r,t,dx[4]=-1,0,1,0,dy[4]=0,-1,0,1;
 15 int tar,sz,dj[N],blo[N],old[N],in[N][N];
 16 int blood(int k)
 17     return floor(4*pow(1.1,(k+5)/6));
 18 
 19 int dis(ji x,ji y)
 20     return sqr(x.x-y.x)+sqr(x.y-y.y);
 21 
 22 int find(ji k)
 23     return in[k.x][k.y];
 24 
 25 void born()
 26     old[++sz]=0;
 27     dj[sz]=++dj[0];
 28     blo[sz]=blood(dj[sz]);
 29     pre[sz]=wei[sz]=ji0,0;
 30 
 31 void del(int k)
 32     if (tar==k)tar=0;
 33     if (tar>k)tar--;
 34     for(int i=k;i<sz;i++)
 35         dj[i]=dj[i+1];
 36         old[i]=old[i+1];
 37         blo[i]=blo[i+1];
 38         wei[i]=wei[i+1];
 39         pre[i]=pre[i+1];
 40     
 41     sz--;
 42 
 43 ji move(ji k,int x)
 44     return jik.x+dx[x],k.y+dy[x];
 45 
 46 bool pd(ji k)
 47     if ((k.x<0)||(k.y<0)||(k.x>n)||(k.y>m))return 0;
 48     for(int i=1;i<=sz;i++)
 49         if (k==wei[i])return 0;
 50     for(int i=1;i<=s;i++)
 51         if (k==ta[i])return 0;
 52     return 1;
 53 
 54 double f(double x,double a,double b,double c)
 55     return a*x*x+b*x+c;
 56 
 57 bool jiao(ji x,ji y,ji z)
 58     if (x.x==y.x)return (x.x==z.x)&&((z.y-x.y)*(z.y-y.y)<=0);
 59     if (x.x>y.x)swap(x,y);
 60     double k=1.0*(y.y-x.y)/(y.x-x.x),b2=1.0*x.y-k*x.x;
 61     double a=k*k+1.0,b=2*(b2*k-z.y*k-z.x),c=sqr(b2-z.y)+sqr(z.x);
 62     if ((f(x.x,a,b,c)<=0.25)||(f(y.x,a,b,c)<=0.25))return 1;
 63     double dui=-0.5*b/a;
 64     return (x.x<=dui)&&(dui<=y.x)&&(f(dui,a,b,c)<=0.25);
 65 
 66 int main()
 67     scanf("%d%d%d%d%d",&n,&m,&s,&d,&r);
 68     r*=r;
 69     for(int i=1;i<=s;i++)scanf("%d%d",&ta[i].x,&ta[i].y);
 70     scanf("%d",&t);
 71     for(int ii=1;ii<=t;ii++)
 72         if ((sz<6)&&(pd(ji0,0)))born();
 73         for(int i=1;i<=sz;i++)in[wei[i].x][wei[i].y]+=2+(i==tar)*3;
 74         for(int i=1;i<=sz;i++)
 75             int fx=-1,ma=-1;
 76             for(int j=0;j<4;j++)
 77                 ji k=move(wei[i],j);
 78                 if ((k!=pre[i])&&(pd(k))&&(find(k)>=ma))
 79                     fx=j;
 80                     ma=find(k);
 81                 
 82             
 83             if (fx==-1)
 84                 pre[i]=wei[i];
 85                 continue;
 86             
 87             if (old[i]%5==4)
 88                 while (1)
 89                     ji k=move(wei[i],fx=(fx+1)%4);
 90                     if ((k!=pre[i])&&(pd(k)))break;
 91                 
 92             pre[i]=wei[i]; 
 93             wei[i]=move(wei[i],fx);
 94         
 95         if (!tar)
 96             for(int i=1;i<=sz;i++)
 97                 if (wei[i]==jin,m)
 98                     tar=i;
 99                     blo[i]=min(blood(dj[i]),blo[i]+blood(dj[i])/2);
100                 
101         for(int i=1;i<=s;i++)
102             int mb=0,mi=0x3f3f3f3f;
103             if ((tar)&&(dis(ta[i],wei[tar])<=r))mb=tar;
104             else
105                 for(int j=1;j<=sz;j++)mi=min(mi,dis(ta[i],wei[j]));
106                 if (mi>r)continue;
107                 for(int j=1;j<=sz;j++)
108                     if (dis(ta[i],wei[j])==mi)
109                         mb=j;
110                         break;
111                     
112             
113             for(int j=1;j<=sz;j++)
114                 if (jiao(wei[mb],ta[i],wei[j]))blo[j]-=d;
115         
116         for(int i=sz;i;i--)
117             if (blo[i]<0)del(i);
118         if ((tar)&&(wei[tar]==ji0,0))
119             printf("Game over after %d seconds\n",ii);
120             break;
121         
122         for(int i=0;i<=n;i++)
123             for(int j=0;j<=m;j++)
124                 if (in[i][j])in[i][j]--;
125         for(int i=1;i<=sz;i++)old[i]++;
126         if (ii==t)printf("The game is going on\n");
127     
128     printf("%d\n",sz);
129     for(int i=1;i<=sz;i++)
130         printf("%d %d %d %d %d\n",old[i],(dj[i]+5)/6,blo[i],wei[i].x,wei[i].y);
131 
View Code

 

以上是关于[bzoj1033]杀蚂蚁的主要内容,如果未能解决你的问题,请参考以下文章

[ZJOI 2008] 杀蚂蚁 (完整版)

[ZJOI2008]杀蚂蚁

[ZJOI2008]杀蚂蚁antbuster

《杀蚂蚁》有感

[ZJOI2008]杀蚂蚁 Solution

P2586 [ZJOI2008]杀蚂蚁