大模拟 猪国杀 杀蚂蚁

来源:互联网 发布:linux 管理员权限 编辑:程序博客网 时间:2024/04/30 11:10

杀蚂蚁

1.所有炮台是一起选择目标,选完之后一起打

2.如果蚂蚁这一秒没有移动位置,仍然要判断它是否会抗蛋糕,因为上一秒抗蛋糕的可能死了

3.蚂蚁的半径是0.5

4.只有洞口没有蚂蚁时新蚂蚁才会出来

链表存蚂蚁比较方便

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define maxn 400005using namespace std;int n,m,T;int num_po,hurt,R,pos_cake;//pos_cake 蛋糕在的蚂蚁编号int cnt=0,now;int last,pre[maxn],nex[maxn];int vis[10][10],w[10][10];bool die[maxn];struct node{       int w,f;}b[5];struct node2{    double dis;    int id;}c[maxn];bool cmp(const node&x,const node&y){    return x.w==y.w ? x.f<y.f : x.w>y.w;} bool cmp2(const node2&x,const node2&y){    return x.dis==y.dis ? x.id<y.id : x.dis<y.dis; }inline int read(){    int x=0;    char ch=getchar();    while(ch<'0'||ch>'9') ch=getchar();    while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }    return x;}double sq(int x)//平方{    return (double)x*(double)x*1.0;}struct Ant//蚂蚁信息{    int id;    int x,y,lastx,lasty;//当前位置 上一次位置    int blood,age,d,ti,bl;//血量 年龄 等级 活动时间 初始血量    bool cake; //有没有抗蛋糕    double quickpow(int x)    {        double op=1.0,e=1.1;        while(x){               if(x&1) op*=e;            e*=e;            x>>=1;          }        return op;    }    void init()    {        id=cnt;                if(id%6==0) d=id/6;        else d=id/6+1;            blood=(int)((double)4*quickpow(d));         bl=blood;        age=ti=x=y=0;        lastx=lasty=0;        vis[x][y]++; //该点的蚂蚁数    }    void del()    {        if(die[id]) return ;        die[id]=1;        now--;        int f=id;        nex[pre[f]]=nex[f];        pre[nex[f]]=pre[f];        vis[x][y]--;        if(cake) pos_cake=0;        cake=0;    }    void left()//留信息素    {        ti++;         if(cake) w[x][y]+=5;        else w[x][y]+=2;    }    bool check(int x,int y)    {        if(x==lastx&&y==lasty) return 0;        else return 1;     }    void getcake()    {        if(x==n&&y==m&&!pos_cake)        {            cake=1,pos_cake=id;            blood=min(bl,blood+bl/2);        }    }    void move()    {        int op=0;         if(y+1<=m&&!vis[x][y+1]&&check(x,y+1)) op++,b[op].f=0,b[op].w=w[x][y+1];        if(x+1<=n&&!vis[x+1][y]&&check(x+1,y)) op++,b[op].f=1,b[op].w=w[x+1][y];        if(y-1>=0&&!vis[x][y-1]&&check(x,y-1)) op++,b[op].f=2,b[op].w=w[x][y-1];        if(x-1>=0&&!vis[x-1][y]&&check(x-1,y)) op++,b[op].f=3,b[op].w=w[x-1][y];//0 东,1 南,2 西,3,北        lastx=x; lasty=y;        if(!op)  return ;        sort(b+1,b+op+1,cmp);        if(ti%5==0)        {            int t=b[1].f,find=0;            for(int i=(t-1+4)%4;i!=b[1].f;i=(i-1+4)%4){                for(int j=1;j<=op;j++)                if(b[j].f==i){ find=1; break; }                if(find){ b[1].f=i;break; }             }         }        vis[x][y]--;        if(b[1].f==0) y=y+1;        if(b[1].f==1) x=x+1;        if(b[1].f==2) y=y-1;        if(b[1].f==3) x=x-1;        vis[x][y]++;    }}a[maxn];struct Po{    int x,y;    int aim;    double getdis(int f)    {        return sqrt(sq(x-a[f].x)+sq(y-a[f].y));     }    double getdis2(double K,double B,int f)    {        double t1=fabs(K*(double)a[f].x-(double)a[f].y+B);        double t2=sqrt(K*K+1.0);        return t1/t2;    }    void getaim()    {        double dis;        if(pos_cake){             dis=getdis(pos_cake);             if(dis<=(double)R){ aim=pos_cake; return ;}        }        int op=0;        for(int i=nex[0];i;i=nex[i])        {            dis=getdis(i);            if(dis<=(double)R){                ++op;                c[op].dis=dis;                c[op].id=i;            }        }        if(!op){ aim=0; return ;}        sort(c+1,c+op+1,cmp2);        aim=c[1].id;     }    void fight()    {        if(!aim) return ;        a[aim].blood-=hurt;        if(a[aim].blood<0) a[aim].del();         int may=max(a[aim].y,y),miy=min(a[aim].y,y);        int mx =max(a[aim].x,x),mix=min(a[aim].x,x);         if(a[aim].x==x){            for(int j=nex[0];j;j=nex[j])                if(a[j].x==x&&miy<=a[j].y&&a[j].y<=may&&j!=aim)                {                      a[j].blood-=hurt;                    if(a[j].blood<0) a[j].del();                  }            return ;        }        double K=(double)(a[aim].y-y)/(double)(a[aim].x-x),B=y-K*x;        double dis;        for(int j=nex[0];j;j=nex[j])            if(mix<=a[j].x&&a[j].x<=mx&&miy<=a[j].y&&a[j].y<=may&&j!=aim){                dis=getdis2(K,B,j);                if(dis<=0.50000){                    a[j].blood-=hurt;                    if(a[j].blood<0) a[j].del();                }             }        return ;    }}p[25];void tower_fight(){    for(int i=1;i<=num_po;i++)  p[i].getaim();    for(int i=1;i<=num_po;i++)  p[i].fight();}void mapinit(){    for(int i=0;i<=n;i++)        for(int j=0;j<=m;j++)        w[i][j]=max(0,w[i][j]-1);//信息素}void print(int x){    printf("Game over after %d seconds\n",x);    printf("%d\n",now);    for(int j=nex[0];j;j=nex[j])        printf("%d %d %d %d %d\n",a[j].age,a[j].d,a[j].blood,a[j].x,a[j].y);    exit(0);}int main(){    //freopen("antbuster_ex.in","r",stdin);    //freopen("antbuster_ex.out","w",stdout);    int x,y,last=0;    n=read(); m=read();    num_po=read(); hurt=read(); R=read();    for(int i=1;i<=num_po;i++)    {        p[i].x=read(); p[i].y=read();        vis[p[i].x][p[i].y]=10;        p[i].aim=0;    }    T=read();    for(int i=1;i<=T;i++)    {        if(!now) last=0;//last 上一秒最后一只蚂蚁的编号        else{            for(int j=nex[0];j;j=nex[j])            if(j) last=j;        }        if(now<6&&!vis[0][0])        {           cnt++; now++;           a[cnt].init();            nex[last]=cnt;  pre[cnt]=last;        }        for(int j=nex[0];j;j=nex[j])        {            a[j].left();            a[j].move();        }        for(int j=nex[0];j;j=nex[j])  a[j].getcake();        tower_fight();        mapinit();        if(pos_cake){            int t=pos_cake;            if(a[t].x==0&&a[t].y==0)  print(i);         }        for(int j=nex[0];j;j=nex[j])  a[j].age++;             }    printf("The game is going on\n");    printf("%d\n",now);    for(int j=nex[0];j;j=nex[j])        printf("%d %d %d %d %d\n",a[j].age,a[j].d,a[j].blood,a[j].x,a[j].y);    return 0;}
猪国杀

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#define maxn 2001using namespace std;int n,m;struct Charator{    int rl;    int he,tl,q[maxn*2];    int num[9];    bool v[maxn*2],id;}a[12];int tl[12];int s[maxn],top;int pre[12],nex[12];bool ti[12],die[12],zb[12];bool mark[12];int  pos_M,die_num,f_num;bool fail=0;int getid(char x){    if(x=='P') return 1;    if(x=='K') return 2;    if(x=='D') return 3;    if(x=='F') return 4;    if(x=='N') return 5;    if(x=='W') return 6;    if(x=='J') return 7;    if(x=='Z') return 8; }char getid2(int x){    if(x==1) return 'P';    if(x==2) return 'K';    if(x==3) return 'D';    if(x==4) return 'F';    if(x==5) return 'N';    if(x==6) return 'W';    if(x==7) return 'J';    if(x==8) return 'Z';}void getp(int x,int n){    while(n--)    {        if(!top) top=1;        a[x].q[a[x].tl++]=s[top];        a[x].num[s[top]]++; top--;    } }int getaim(int x){    if(a[x].rl==1)    {        for(int i=nex[x];i!=x;i=nex[i])        if(mark[i]||(ti[i]&&a[i].rl==3)) return i;        return 0;    }    if(a[x].rl==2)    {        for(int i=nex[x];i!=x;i=nex[i])        if(ti[i]&&a[i].rl==3)  return i;        return 0;     }    if(a[x].rl==3)  return pos_M;}void print(){    if(fail) printf("FP\n");    else printf("MP\n");    for(int i=1;i<=n;i++)    if(die[i]) printf("DEAD\n");    else{        for(int j=a[i].he;j<a[i].tl;j++)        if(!a[i].v[j]) printf("%c ",getid2(a[i].q[j]));        printf("\n");    }    exit(0);}void del(int x){    die[x]=1;    pre[nex[x]]=pre[x];    nex[pre[x]]=nex[x];    if(a[x].rl==1){ fail=1; print(); }    if(a[x].rl==3) die_num++;    if(die_num==f_num) print();}void qp(int x,int type,int n){    a[x].num[type]-=n;    for(int i=a[x].he;i<a[x].tl;i++)    if(!a[x].v[i]&&a[x].q[i]==type){        a[x].v[i]=1;        n--;        if(!n) break;    }    while(a[x].v[a[x].he]) a[x].he++;    return ;}void waste(){    int x=pos_M;    a[x].he=a[x].tl; zb[x]=0;    for(int j=1;j<=8;j++) a[x].num[j]=0;}void make_p(int x,int w){    if(w){        tl[x]++; qp(x,1,1);         return ;    }    int op=1-tl[x];    if(op>a[x].num[1]) del(x);     else{ qp(x,1,op); tl[x]=1; }}void defend_k(int x){    if(a[x].num[3]){  qp(x,3,1);  return ; }    tl[x]--;    if(tl[x]<=0) make_p(x,0);}void make_k(int x,int aim){    qp(x,2,1);    ti[x]=1; mark[x]=0;     defend_k(aim);    if(die[aim]&&a[aim].rl==3) getp(x,3);    if(die[aim]&&a[aim].rl==2&&a[x].rl==1) waste();    return ;}  bool make_j(int x,int type)//当前x出的牌是否有效{    int i=x;    while(1)    {        if(a[i].id==type&&a[i].num[7]){            ti[i]=1; mark[i]=0;            qp(i,7,1);            if(make_j(i,type^1)) return 0;            else return 1;        }        i=nex[i];        if(i==x) break;    }    return 1;}void make_f(int x,int aim){    qp(x,4,1);    ti[x]=1; mark[x]=0;     bool op=1;    if(ti[aim]&&!make_j(x,a[aim].id)) op^=1;    if(!op) return;    if(a[x].rl==1&&a[aim].rl==2)    {             tl[aim]--;        if(tl[aim]<=0) make_p(aim,0);        if(die[aim])  waste();        return ;    }    while(1)    {        if(!a[aim].num[2]){            tl[aim]--;            if(tl[aim]<=0) make_p(aim,0);            if(die[aim]&&a[aim].rl==3&&!die[x])  getp(x,3);            return ;        }         qp(aim,2,1);        if(!a[x].num[2]){            tl[x]--;            if(tl[x]<=0)  make_p(x,0);            if(die[x]&&a[x].rl==3&&!die[aim])  getp(aim,3);            return ;        }        qp(x,2,1);    }    return ;}void make_n(int x){    qp(x,5,1);    for(int i=nex[x];i!=x;i=nex[i])    {        if(ti[i]&&!make_j(x,a[i].id)) continue;        if(a[i].num[2])  qp(i,2,1);        else{            tl[i]--;            if(a[i].rl==1) mark[x]=1;            if(tl[i]<=0) make_p(i,0);            if(die[i]&&a[i].rl==3) getp(x,3);             if(die[i]&&a[i].rl==2&&a[x].rl==1) waste();        }    }}void make_w(int x){    qp(x,6,1);    for(int i=nex[x];i!=x;i=nex[i])    {        if(ti[i]&&!make_j(x,a[i].id)) continue;        if(a[i].num[3])  qp(i,3,1);        else{            tl[i]--;            if(a[i].rl==1) mark[x]=1;            if(tl[i]<=0) make_p(i,0);            if(die[i]&&a[i].rl==3) getp(x,3);             if(die[i]&&a[i].rl==2&&a[x].rl==1) waste();        }    }   }void make_z(int x){    qp(x,8,1);  zb[x]=1;}void work(int x) {    int t,aim,aim2;    bool op=0,op1=0;    getp(x,2);    while(1)    {        if(die[x]) return;            op1=0;        aim=getaim(x);        for(int i=a[x].he;i<a[x].tl;i++)        if(!a[x].v[i])        {            if(die[x]) return ;            t=a[x].q[i];            if(t==2&&a[x].rl==3)            {                if(a[nex[x]].id!=a[x].id&&ti[nex[x]]) aim=nex[x];            }            if(t==1&&tl[x]==4) continue;            if(t==3||t==7) continue;            if(t==2&&(nex[x]!=aim||(op&&!zb[x]))) continue;            if(t==4&&!aim) continue;                        op1=1;             if(t==1) make_p(x,i);            if(t==2) make_k(x,aim),op=1;            if(t==4) make_f(x,aim);            if(t==5) make_n(x);             if(t==6) make_w(x);             if(t==8) make_z(x);             break;        }        if(die[x]) return ;        if(!op1) break;        while(a[x].v[a[x].he]) a[x].he++;        if(a[x].he>=a[x].tl) break;    }    return ;}int main(){    char type[3]; int x;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%s",type);        tl[i]=4;         if(type[0]=='M'){ a[i].rl=1; pos_M=i; ti[i]=1; }        if(type[0]=='Z')  a[i].rl=2;        if(type[0]=='F'){ a[i].rl=3; a[i].id=1; f_num++; }        for(int j=1;j<=4;j++)        {            scanf("%s",type);            x=getid(type[0]);            a[i].q[a[i].tl++]=x;            a[i].num[x]++;         }    }    for(int i=1;i<=m;i++)    {        scanf("%s",type);        s[m-i+1]=getid(type[0]);    }    top=m;    for(int i=1;i<=n;i++){        pre[i]=i-1; nex[i]=i+1;    }    nex[0]=1;    pre[1]=n;  nex[n]=1;    for(int i=nex[0];i<=n;i=nex[i])  work(i);     return 0;}



原创粉丝点击