猪国杀 大模拟

 

 

直接上code

 

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
#define ll long long
#define pr(x) ((x)->pr)
#define nx(x) ((x)->nx)
#define v(x) ((x)->v)
#define id(x) ((x)->id)
#define fi(x) ((x)->fi)
#define en(x) ((x)->en)
#define fan(x) ((x)->fan)
#define lei(x) ((x)->lei)
#define zhong(x) ((x)->zhong)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{
    char q=getchar();int ans=0,flag=1;
    while(q<'0'||q>'9'){if(q=='-')flag=-1;q=getchar();}
    while(q>='0'&&q<='9'){ans=ans*10+q-'0';q=getchar();}
    return ans*flag;
}
const int N=13;
const int M=2006;

int ppre[N],pnxt[N];

int n,m,yuann;
char s[5];
char c[M];
int pre[M],nxt[M],nowcard;
int numfan;

// 0_MP 1_ZP 2_FP
// P桃 K杀 D闪 F决斗 N南蛮 W万箭 J无懈 Z诸葛

struct Card
{
    char v;
    Card *pr,*nx;
    Card(){pr=NULL;nx=NULL;}
    Card(char _v){v=_v;pr=NULL;nx=NULL;}
};
struct Pig
{
    int id,blood;
    bool lei,fan,zhong,live,ifz;
    Card *fi,*en;
    Pig(){fi=NULL;en=NULL;}
    Pig(char _id){id=_id;fi=NULL;en=NULL;}
    inline void chu()
    {
        lei=fan=zhong=ifz=0;live=1;
        blood=4;
        fi=new Card(0);en=new Card(0);
        nx(fi)=en;pr(en)=fi;
    }
    inline void add(char _v)
    {
        Card *x=new Card(_v);
        nx(pr(en))=x;
        pr(x)=pr(en);nx(x)=en;
        pr(en)=x;
    }
    inline void del(Card *&x)
    {
        nx(pr(x))=nx(x);pr(nx(x))=pr(x);
    }
    inline void get_card(int num)
    {
        for(int i=1;i<=num;++i)
        {
            nowcard=nxt[nowcard];
            add(c[nowcard]);
        }
    }
    inline Card * have_shan()
    {
        for(Card *x=nx(fi);x!=en;x=nx(x))
            if(v(x)=='D')
                return x;
        return NULL;
    }
    inline Card * have_wuxie()
    {
        for(Card *x=nx(fi);x!=en;x=nx(x))
            if(v(x)=='J')
                return x;
        return NULL;
    }
    inline Card * have_sha()
    {
        for(Card *x=nx(fi);x!=en;x=nx(x))
            if(v(x)=='K')
                return x;
        return NULL;
    }
    inline void self_help()
    {
        for(Card *x=nx(fi);x!=en;x=nx(x))
            if(v(x)=='P')
            {
                ++blood;
                del(x);
                if(blood>0)
                    return ;
            }
    }
    inline void showcard()
    {
        for(Card *x=nx(fi);x!=en;x=nx(x))
            printf("%c ",v(x));
        printf("\n");
    }
    inline void card_is_none()
    {
        nx(fi)=en;
        pr(en)=fi;
        ifz=0;//装备牌也要弃...
    }
    inline void out1()
    {
        printf("blood=%d lei=%d fan=%d zhong=%d ifz=%d ",blood,lei,fan,zhong,ifz);
        for(Card *x=nx(fi);x!=en;x=nx(x))
            printf("%c ",v(x));
        printf("\n");
    }
}p[N];

inline void judge_attack(int who,int now)
{
    if(p[now].id==0||p[now].zhong)
        p[who].lei=0,p[who].fan=1;
    else
        if(p[now].fan)
        {
            p[who].lei=0;
            if(p[who].id==1)
                p[who].zhong=1;
        }
}

inline void judge_help(int who,int now)
{
    if(p[now].id==0||p[now].zhong)
    {
        p[who].lei=0;
        if(p[who].id==1)
            p[who].zhong=1;
    }
    else
        if(p[now].fan)
        {
            p[who].lei=0;
            p[who].fan=1;
        }
}

inline void judge_lei(int who,int now)
{
    if(p[now].id==0)
    {
        if(p[who].id==1&&!p[who].zhong)
            p[who].lei=1;
        else
            if(p[who].id==2&&!p[who].fan)
                p[who].lei=1;
    }
}

inline void delpig(int order)
{
    --n;
    if(p[order].id==2)
        --numfan;
    p[order].live=0;
    pnxt[ppre[order]]=pnxt[order];
    ppre[pnxt[order]]=ppre[order];
}

inline void showpig()
{
    for(int i=1;i<=yuann;++i)
    {
        if(p[i].live)
            p[i].showcard();
        else
            printf("DEAD\n");
    }
}

inline void MPdie()
{
    printf("FP\n");
    showpig();
    exit(0);
}

inline void FPdie()
{
    printf("MP\n");
    showpig();
    exit(0);
}

inline void help(int who,int now)
{
    p[now].self_help();
    if(p[now].blood<=0)
    {
        delpig(now);
        if(p[now].id==0)
            MPdie();
        if(!numfan)
            FPdie();
        if(p[now].id==1&&p[who].id==0)
            p[who].card_is_none();
        else
            if(p[now].id==2)
                p[who].get_card(3);
    }
}

inline void get_hurt(int who,int now)
{
    --p[now].blood;
    if(p[now].blood<=0)
        help(who,now);
}

inline void attack(int now,int aid)
{
    judge_attack(now,aid);
    Card *x=p[aid].have_shan();
    if(x==NULL)
        get_hurt(now,aid);
    else
        p[aid].del(x);
    if(p[aid].id==0||p[aid].zhong)
        p[now].fan=1,p[now].lei=0;
    else
        if(p[aid].fan)
            p[now].zhong=1,p[now].lei=0;
}

inline bool is_friend(int now,int aid)
{
    return ((p[now].id==0||p[now].id==1)&&(p[aid].id==0||p[aid].zhong))||(p[now].id==2&&p[aid].fan);
}

inline bool is_enemy(int now,int aid)
{
    return ((p[now].id==1||p[now].id==0)&&p[aid].fan)||(p[now].id==2&&(p[aid].id==0||p[aid].zhong));
}

inline void wuxie(int be,int aid,int &ff)
{
    int nowp=be;
    Card *x;
    for(int i=1;i<=n;++i,nowp=pnxt[nowp])
    {
        x=p[nowp].have_wuxie();
        if( is_enemy(nowp,aid)&&x!=NULL )
        {
            judge_attack(nowp,aid);
            ff^=1;
            p[nowp].del(x);
            wuxie(nowp,nowp,ff);
            return ;
        }
    }
}

inline int WUXIE(int now,int aid)
{
    int nowp=now,ff;
    Card *x;
    for(int i=1;i<=n;++i,nowp=pnxt[nowp])
    {
        x=p[nowp].have_wuxie();
        if( is_friend(nowp,aid)&&x!=NULL )
        {
            judge_help(nowp,aid);
            ff=1;
            p[nowp].del(x);
            wuxie(nowp,nowp,ff);
            return ff;
        }
    }
    return 0;
}

inline void MPF2(int now,int aid)
{
    if(WUXIE(now,aid))
        return ;
    if(p[now].id==0&&p[aid].id==1)
    {
        get_hurt(now,aid);
        return ;
    }
    int who=0;
    Card *x;
    while(1)
    {
        who^=1;
        if(who)
        {
            x=p[aid].have_sha();
            if(x==NULL)
            {
                get_hurt(now,aid);
                break;
            }
            else
                p[aid].del(x);
        }
        else
        {
            x=p[now].have_sha();
            if(x==NULL)
            {
                get_hurt(aid,now);
                break;
            }
            else
                p[now].del(x);
        }
    }
}

inline int MPF(int now,Card *x)
{
    int nowp=pnxt[now];
    for(int i=1;i<n;++i,nowp=pnxt[nowp])
    {
        if(p[nowp].lei||p[nowp].fan)
        {
            p[now].del(x);
            judge_attack(now,nowp);
            MPF2(now,nowp);
            return 1;
        }
    }
    return 0;
}

inline void nanman(int now)
{
    int nowp=pnxt[now];
    Card *x;
    int tt=n;// 防止死人之后少枚举
    for(int i=1;i<tt;++i,nowp=pnxt[nowp])
    {
        
        if(WUXIE(now,nowp))
            continue;
        x=p[nowp].have_sha();
        if(x==NULL)
            get_hurt(now,nowp),judge_lei(now,nowp);
        else
            p[nowp].del(x);
        
    }
}

inline void wanjian(int now)
{
    int nowp=pnxt[now];
    Card *x;
    int tt=n;
    for(int i=1;i<tt;++i,nowp=pnxt[nowp])
    {
        if(WUXIE(now,nowp))
            continue;
        x=p[nowp].have_shan();
        if(x==NULL)
            get_hurt(now,nowp),judge_lei(now,nowp);
        else
            p[nowp].del(x);
    }
}

inline void MP(int now)
{
    int nowp,attacknum=0;
    for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
    {
        if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
        if(v(x)=='K'&&(!attacknum||p[now].ifz))
        {
            nowp=pnxt[now];
            if(p[nowp].lei||p[nowp].fan)
                ++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
        }
        if(v(x)=='F')if(MPF(now,x))x=p[now].fi;
        if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
        if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
        if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;

        if(!p[now].live)//我的猪跟别人决斗死了还在继续出牌...
            break;
    }
}

inline void is_MP(int now)
{
    p[now].get_card(2);
    MP(now);
}

inline void ZPF2(int now,int aid)
{
    if(WUXIE(now,aid))
        return ;
    int who=0;
    Card *x;
    while(1)
    {
        who^=1;
        if(who)
        {
            x=p[aid].have_sha();
            if(x==NULL)
            {
                get_hurt(now,aid);
                break;
            }
            else
                p[aid].del(x);
        }
        else
        {
            x=p[now].have_sha();
            if(x==NULL)
            {
                get_hurt(aid,now);
                break;
            }
            else
                p[now].del(x);
        }
    }
}

inline int ZPF(int now,Card *x)
{
    int nowp=pnxt[now];
    for(int i=1;i<n;++i,nowp=pnxt[nowp])
    {
        if( p[nowp].fan )
        {
            p[now].del(x);
            judge_attack(now,nowp);
            ZPF2(now,nowp);
            return 1;
        }
    }
    return 0;
}

inline void ZP(int now)
{
    int nowp,attacknum=0;
    for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
    {
        if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
        if(v(x)=='K'&&(!attacknum||p[now].ifz))
        {
            nowp=pnxt[now];
            if(p[nowp].fan)
                ++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
        }
        if(v(x)=='F')if(ZPF(now,x))x=p[now].fi;
        if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
        if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
        if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;
        if(!p[now].live)
            break;
    }
}

inline void is_ZP(int now)
{
    p[now].get_card(2);
    ZP(now);
}

inline void FPF2(int now,int aid)
{
    if(WUXIE(now,aid))
        return ;
    int who=0;
    Card *x;
    while(1)
    {
        who^=1;
        if(who)
        {
            x=p[aid].have_sha();
            if(x==NULL)
            {
                get_hurt(now,aid);
                break;
            }
            else
                p[aid].del(x);
        }
        else
        {
            x=p[now].have_sha();
            if(x==NULL)
            {
                get_hurt(aid,now);
                break;
            }
            else
                p[now].del(x);
        }
    }
}

inline void FPF(int now)
{
    judge_attack(now,1);
    FPF2(now,1);
}

inline void FP(int now)
{
    int nowp,attacknum=0;
    for(Card *x=nx(p[now].fi);x!=p[now].en;x=nx(x))
    {
        if(v(x)=='P'&&p[now].blood<4)p[now].del(x),++p[now].blood;
        if(v(x)=='K'&&(!attacknum||p[now].ifz))
        {
            nowp=pnxt[now];
            if(p[nowp].zhong||p[nowp].id==0)
                ++attacknum,p[now].del(x),attack(now,nowp),x=p[now].fi;
        }
        if(v(x)=='F')p[now].del(x),FPF(now),x=p[now].fi;
        if(v(x)=='N')p[now].del(x),nanman(now),x=p[now].fi;
        if(v(x)=='W')p[now].del(x),wanjian(now),x=p[now].fi;
        if(v(x)=='Z')p[now].del(x),p[now].ifz=1,x=p[now].fi;
    
        if(!p[now].live)
            break;
    }
}

inline void is_FP(int now)
{
    p[now].get_card(2);
    FP(now);
}

void work()
{
    nowcard=0;
    int now=1;
    for(int i=1;;++i)
    {
        if(p[now].id==0) is_MP(now);
        else if(p[now].id==1) is_ZP(now);
        else is_FP(now);
        now=pnxt[now];
    }
}

// 0_MP 1_ZP 2_FP
// P桃 K杀 D闪 F决斗 N南蛮 W万箭 J无懈 Z诸葛
int main(){

    //freopen("in.in","r",stdin);
    //freopen("kopk.in","r",stdin);
    //freopen("kopk.out","w",stdout);
    //freopen("out.out","w",stdout);

    n=read();m=read();
    yuann=n;
    for(int i=1;i<=n;++i)
    {
        p[i].chu();
        scanf("%s",s);
        if(s[0]=='M')
            p[i].id=0;
        else
            if(s[0]=='Z')
                p[i].id=1;
        else
        {
            ++numfan;
            p[i].id=2;
        }
        for(int j=1;j<=4;++j)
        {
            scanf("%s",s);
            p[i].add(s[0]);
        }
        ppre[i]=i-1;
        pnxt[i]=i+1;
    }
    ppre[1]=n;
    pnxt[n]=1;
    for(int i=1;i<=m;++i)
    {
        scanf("%s",s);
        c[i]=s[0];
        pre[i]=i-1;
        nxt[i]=i+1;
    }
    nxt[0]=1;nxt[m]=m;
    work();
}
AAA

 

posted @ 2017-10-13 14:13  A_LEAF  阅读(227)  评论(0编辑  收藏  举报