zoukankan      html  css  js  c++  java
  • 猪国杀 大模拟

     

     

    直接上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("
    ");
        }
        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("
    ");
        }
    }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
    ");
        }
    }
    
    inline void MPdie()
    {
        printf("FP
    ");
        showpig();
        exit(0);
    }
    
    inline void FPdie()
    {
        printf("MP
    ");
        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

     

  • 相关阅读:
    LeetCode 217. 存在重复元素
    LeetCode 48. 旋转图像
    LeetCode 35. 搜索插入位置
    LeetCode 27. 移除元素
    LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)
    LeetCode 328. 奇偶链表
    LeetCode 160. 相交链表 (找出两个链表的公共结点)
    LeetCode 26. 删除排序数组中的重复项
    LeetCode 836. 矩形重叠
    数据库
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7660901.html
Copyright © 2011-2022 走看看