大模拟 猪国杀 杀蚂蚁

杀蚂蚁

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

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

3.蚂蚁的半径是0.5

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

链表存蚂蚁比较方便

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 400005
using 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 2001
using 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;
}



posted @ 2017-10-14 06:09  HunterxHunterl  阅读(281)  评论(0编辑  收藏  举报