美文网首页
Luogu P2482 Code

Luogu P2482 Code

作者: Macesuted | 来源:发表于2020-01-18 14:55 被阅读0次

    P2482

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <cstdlib>
    
    using std::cout;
    using std::endl;
    using std::cin;
    using std::ios;
    
    #define CANNOT_USE_THIS_CARD      true
    #define CAN_USE_THIS_CARD         false
    #define THIS_PIG_IS_DEAD          true
    #define THIS_PIG_IS_NOT_DEAD      false
    #define THIS_PIG_IS_JUMP          true
    #define THIS_PIG_IS_NOT_JUMP      false
    #define THIS_PIG_LIKE_BAD         true
    #define THIS_PIG_DO_NOT_LIKE_BAD  false
    #define CROSSBOW_ON               true
    #define CROSSBOW_DOWN             false
    #define THIS_TURN_USED_KILL       true
    #define THIS_TURN_DO_NOT_USE_KILL false
    
    struct card
    {
        char                    which                   ;
        bool                    use                     ;
    };
    
    typedef std::vector<card>::iterator myit;
    
    class pig
    {
    private:
        int                     hp                      ;
        bool                    use_kill                ;
        bool                    crossbow                ;
        bool                    jumped                  ;
        bool                    like_bad                ;
        void                    die         (int)       ;
        void                    clear       (void)      ;
        void                    del         (myit&)     ;
        myit                    find        (char)      ;
        void                    cut         (void)      ;
        void                    use         (card&)     ;
        void                    hurt        (int)       ;
        bool                    canuse      (char)      ;
        int                     find_K      (void)      ;
        int                     find_F      (void)      ;
        bool                    K_respond   (void)      ;
        bool                    N_respond   (void)      ;
        bool                    W_respond   (void)      ;
        bool                    ask_J       (int)       ;
        bool                    back_J      (int)       ;
    public:
                                pig         (void)      ;
        int                     num                     ;
        bool                    dead                    ;
        std::string             name                    ;
        std::vector<card>       cards                   ;
        void                    myturn      (void)      ;
        void                    jump        (void)      ;
        void                    K           (int)       ;
        void                    F           (int)       ;
        void                    N           (void)      ;
        void                    W           (void)      ;
    };
    
    void gameover(std::string);
    
    int n,m;
    int FP;
    card stack[2005];
    pig member[15];
    int top=1;
    
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>n>>m;
        for(register int i=1;i<=n;i++)
        {
            cin>>member[i].name;
            member[i].num=i;
            if(member[i].name=="FP") FP++;
            for(register int j=1;j<=4;j++)
            {
                card c;
                cin>>c.which;
                c.use=CAN_USE_THIS_CARD;
                member[i].cards.push_back(c);
            }
        }
        for(top=1;top<=m;top++)
        {
            card c;
            cin>>c.which;
            c.use=CAN_USE_THIS_CARD;
            stack[top]=c;
        }
        top=1;
        int point=0;
        member[1].jump();
        while(true)
        {
            point=point%n+1;
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            member[point].myturn();
        }
    }
    
    void gameover(std::string who)
    {
        cout<<who<<std::endl;
        for(register int i=1;i<=n;i++)
        {
            if(member[i].dead==THIS_PIG_IS_DEAD) cout<<"DEAD";
            else for(myit it=member[i].cards.begin();it!=member[i].cards.end();it++)
            {
                if(it->use==CANNOT_USE_THIS_CARD) continue;
                cout<<it->which<<' ';
            }
            cout<<std::endl;
        }
        exit(0);
    }
    
    void pig::die(int who)
    {
        this->dead=THIS_PIG_IS_DEAD;
        if(this->name=="MP")
            gameover("FP");
        if(this->name=="FP") FP--;
        if(FP==0) gameover("MP");
        if(this->name=="FP")
        {
            member[who].cut();
            member[who].cut();
            member[who].cut();
        }
        if(this->name=="ZP"&&member[who].name=="MP")
            member[who].clear();
        return;
    }
    
    void pig::clear(void)
    {
        this->cards.clear();
        this->crossbow=CROSSBOW_DOWN;
        return;
    }
    
    void pig::del(myit& it)
    {
        it->use=CANNOT_USE_THIS_CARD;
        return;
    }
    
    myit pig::find(char which)
    {
        for(myit it=this->cards.begin();it!=this->cards.end();it++)
        {
            if(it->use==CANNOT_USE_THIS_CARD) continue;
            if(it->which==which) return it;
        }
        return this->cards.end();
    }
    
    void pig::cut(void)
    {
        this->cards.push_back(stack[top++]);
        if(top>m) top=m;
        return;
    }
    
    void pig::use(card& c)
    {
        if(c.which=='K')
        {
            int who;
            who=this->find_K();
            if(who!=0)
            {
                c.use=CANNOT_USE_THIS_CARD;
                this->K(who);
            }
        }
        else if(c.which=='P')
        {
            if(this->hp<4)
            {
                c.use=CANNOT_USE_THIS_CARD;
                this->hp++;
            }
        }
        else if(c.which=='F')
        {
            int who;
            who=this->find_F();
            if(who!=0)
            {
                c.use=CANNOT_USE_THIS_CARD;
                this->F(who);
            }
        }
        else if(c.which=='N')
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->N();
        }
        else if(c.which=='W')
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->W();
        }
        else if(c.which=='Z')
        {
            c.use=CANNOT_USE_THIS_CARD;
            this->crossbow=CROSSBOW_ON;
        }
        return;
    }
    
    void pig::hurt(int who)
    {
        this->hp--;
        if(this->hp==0)
        {
            myit t=this->find('P');
            if(t==this->cards.end()) this->die(who);
            else
            {
                this->del(t);
                this->hp++;
            }
        }
        return;
    }
    
    bool pig::canuse(char c)
    {
        if(c=='P'&&this->hp<4) return true;
        if((c=='K'&&this->find_K()!=0)||(c=='F'&&this->find_F()!=0)||c=='N'||c=='W'||c=='Z') return true;//濡傛灉鍙互鐢?
        return false;
    }
    
    int pig::find_K(void)
    {
        if(this->use_kill==THIS_TURN_USED_KILL&&this->crossbow==CROSSBOW_DOWN) return 0;//濡傛灉杩欏洖鍚堝凡缁忕敤杩囦簡鏉€鑰屾病鏈夎杩囩尓鍝ヨ繛寮?
        if(this->name=="MP")
            for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
            {
                if(member[point].dead==THIS_PIG_IS_DEAD) continue;
                if(member[point].like_bad==THIS_PIG_LIKE_BAD||(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP))
                    return point;
                else return 0; 
            }
        else if(this->name=="ZP")
            for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
            {
                if(member[point].dead==THIS_PIG_IS_DEAD) continue;
                if(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                    return point;
                else return 0;
            }
        else if(this->name=="FP")
            for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
            {
                if(member[point].dead==THIS_PIG_IS_DEAD) continue;
                if(member[point].name!="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                    return point;
                else return 0;
            }
        return 0;
    }
    
    int pig::find_F(void)
    {
        if(this->name=="MP")
            for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
            {
                if(member[point].dead==THIS_PIG_IS_DEAD) continue;
                if(member[point].like_bad==THIS_PIG_LIKE_BAD||(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP))
                    return point;
            }
        else if(this->name=="ZP")
            for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
            {
                if(member[point].dead==THIS_PIG_IS_DEAD) continue;
                if(member[point].name=="FP"&&member[point].jumped==THIS_PIG_IS_JUMP)
                    return point;
            }
        else if(this->name=="FP") return 1;
        return 0;
    }
    
    bool pig::K_respond(void)
    {
        myit it=this->find('D');
        if(it==this->cards.end()) return false;
        this->del(it);
        return true;
    }
    
    bool pig::N_respond(void)
    {
        myit it=this->find('K');
        if(it==this->cards.end()) return false;
        this->del(it);
        return true;
    }
    
    bool pig::W_respond(void)
    {
        myit it=this->find('D');
        if(it==this->cards.end()) return false;
        this->del(it);
        return true;
    }
    
    bool pig::ask_J(int who)
    {
        bool check=true;
        if(this->jumped==THIS_PIG_IS_NOT_JUMP) return false;
        for(register int point=who;point!=who||check==true;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            check=false;
            if(this->name!="FP"&&member[point].name=="FP") continue;
            if(this->name=="FP"&&member[point].name!="FP") continue;
            myit it=member[point].find('J');
            if(it!=member[point].cards.end())
            {
                member[point].del(it);
                member[point].jump();
                return !member[point].back_J(this->num);
            }
        }
        return false;
    }
    
    bool pig::back_J(int to)
    {
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(this->name!="FP"&&member[point].name=="ZP") continue;
            if(this->name=="FP"&&member[point].name=="FP") continue;
            if(this->name=="ZP"&&member[point].name!="FP") continue;
            myit it=member[point].find('J');
            if(it!=member[point].cards.end())
            {
                member[point].del(it);
                member[point].jump();
                return !member[to].ask_J(point);
            }
        }
        return false;
    }
    
    pig::pig(void)
    {
        this->hp=4;
        this->dead=THIS_PIG_IS_NOT_DEAD;
        this->jumped=THIS_PIG_IS_NOT_JUMP;
        this->crossbow=CROSSBOW_DOWN;
        this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
        this->use_kill=THIS_TURN_DO_NOT_USE_KILL;
        return;
    }
    
    void pig::myturn(void)
    {
        this->cut();
        this->cut();
        bool check=true;
        while(check) 
        {
            check=false;
            for(myit it=this->cards.begin();it!=this->cards.end();it++)
            {
                if(it->use==CANNOT_USE_THIS_CARD) continue;
                if(canuse(it->which)==false) continue;
                use(*it);
                if(this->dead==THIS_PIG_IS_DEAD) return;
                it=this->cards.begin()-1;
                check=true;
            }
        }
        member[this->num].use_kill=THIS_TURN_DO_NOT_USE_KILL;
        return;
    }
    
    void pig::jump(void)
    {
        this->jumped=THIS_PIG_IS_JUMP;
        return;
    }
    
    void pig::K(int to)
    {
        if(this->use_kill==THIS_TURN_USED_KILL&&this->crossbow==false) return;
        this->jump();
        this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
        this->use_kill=THIS_TURN_USED_KILL;
        if(member[to].K_respond()==false)
            member[to].hurt(this->num);
        return;
    }
    
    void pig::F(int to)
    {
        this->jump();
        this->like_bad=THIS_PIG_DO_NOT_LIKE_BAD;
        if(member[to].ask_J(this->num)==true) return;
        if(this->name=="MP"&&member[to].name=="ZP")
        {
            member[to].hurt(this->num);
            return;
        }
        int who;
        while(true)
        {
            myit t;
            t=member[to].find('K');
            if(t==member[to].cards.end())
            {
                who=2;
                break;
            }
            else member[to].del(t);
            t=this->find('K');
            if(t==this->cards.end())
            {
                who=1;
                break;
            }
            else this->del(t);
        }
        if(who==2)
            member[to].hurt(this->num);
        if(who==1)
            this->hurt(to);
        return;
    }
    
    void pig::N(void)
    {
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].ask_J(this->num)==true) continue;
            if(member[point].N_respond()==false) 
            {
                member[point].hurt(this->num);
                if(member[point].name=="MP"&&this->jumped==THIS_PIG_IS_NOT_JUMP)
                {
                    this->like_bad=THIS_PIG_LIKE_BAD;
                }
            }
        }
        return;
    }
    
    void pig::W(void)
    {
        for(register int point=this->num%n+1;point!=this->num;point=point%n+1)
        {
            if(member[point].dead==THIS_PIG_IS_DEAD) continue;
            if(member[point].ask_J(this->num)==true) continue;
            if(member[point].W_respond()==false)
            {
                member[point].hurt(this->num);
                if(member[point].name=="MP"&&this->jumped==THIS_PIG_IS_NOT_JUMP)
                    this->like_bad=THIS_PIG_LIKE_BAD;
            }
        }
        return;
    }
    

    转载自本人Luogu Blog这篇文章

    相关文章

      网友评论

          本文标题:Luogu P2482 Code

          本文链接:https://www.haomeiwen.com/subject/eybkzctx.html