zoukankan      html  css  js  c++  java
  • [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]=ji{0,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 ji{k.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(ji{0,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]==ji{n,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]==ji{0,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
  • 相关阅读:
    vscode设置js文件自动格式化单引号
    解决git每次输入账号密码问题
    vscode设置vouter标签不换行
    查看修改npm地址并登录
    正则匹配[]外部的内容
    使用v-model实现父子组件之间传值
    发布网站
    安装IIS
    IIS服务添加角色
    react生命周期
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/11454589.html
Copyright © 2011-2022 走看看