5pt求调
查看原帖
5pt求调
1000392
I_am_Lord_Voldemort楼主2024/10/21 11:37
#include<bits/stdc++.h>
using namespace std;
const int maxn=10;
/*------------------------------------------------------------------------------------------------------*/
//角色操作
struct Pig{
    string card;
    int last,next;
    int hp;
    char charactor;
    int is_dead,show,be_think;
    bool pig_bro;
    Pig(){
        hp=4,is_dead=0,show=0,be_think=0,pig_bro=0;
    }
}pig[maxn];     
int n,m,result;
string all;
void getcard(int u,int sum){
    while(sum--){
        pig[u].card+=all[0];
        all.erase(0,1);
    }
}
void no_card(int u){
    pig[u].card="";
    pig[u].pig_bro=0;
}
void find_peach(int u){
    int pos=pig[u].card.find('P');
    if(pos!=-1){
        pig[u].hp++;
        pig[u].card.erase(pos,1);
    }
}
void lose_hp(int u,int killer){
    pig[u].hp--;
    if(pig[u].hp==0) find_peach(u);
    if(pig[u].hp==0){
        pig[u].is_dead=1;
        pig[pig[u].last].next=pig[u].next;
        pig[pig[u].next].last=pig[u].last;
        if(pig[u].charactor=='F'){
            getcard(killer,3);
        }
        if(pig[u].charactor=='Z'&&pig[killer].charactor=='M'){
            no_card(killer);
        }
    }
}

/*------------------------------------------------------------------------------------------------------*/
//基础操作
int run(int u,char c,int killer){ //闪
    int pos=pig[u].card.find(c);
    if(pos==-1){
        lose_hp(u,killer);
        return 0;
    }
    else{
        pig[u].card.erase(pos,1);
        return 1;
    }
}
int kill(int u,int v,int pos){ //u有机会对v出杀
    if( ((pig[u].charactor=='M'||pig[u].charactor=='Z') && (pig[v].charactor=='F') && (pig[v].show)) || (pig[u].charactor=='M'&&pig[v].be_think==1) || ( pig[u].charactor=='F' && ( pig[v].charactor=='M'|| (pig[v].charactor=='Z'&&pig[v].show) ) ) ){
        pig[u].show=1;pig[u].be_think=0;
        pig[u].card.erase(pos,1);
        bool sb=run(v,'D',u);
        return 1;
    }
    return 0;
}
int peach(int u,int pos){
    if(pig[u].hp!=4){
        pig[u].hp++;
        pig[u].card.erase(pos,1);
        return 1;
    }
    return 0;
}
/*------------------------------------------------------------------------------------------------------*/
//锦囊妙计
int no_relaxation_for_you_to_attack(int u,int beuseder,int killer){
    bool good=(pig[beuseder].charactor=='M'||pig[beuseder].charactor=='Z'&&pig[beuseder].show==1);
    bool bad=(pig[beuseder].charactor=='F'&&pig[beuseder].show==1);
    int v=u,tag=0;
    bool res=0;
    for(;;v=pig[v].next){
        if(v==u){
            if(tag) break;
            tag=1;
        }
        if( ((pig[v].charactor=='M'||pig[v].charactor=='Z')&&good) || (pig[v].charactor=='F'&&bad) ){
            int pos=pig[v].card.find('J');
            if(pos!=-1&&res==0){
                pig[v].card.erase(pos,1);
                pig[v].show=1;
                res^=no_relaxation_for_you_to_attack(u,killer,beuseder);
            }
        }
    }
    return res;
}
void south_pigs_comming_to_kill_you(int u,int killer){
    if(u==killer) return;
    if(no_relaxation_for_you_to_attack(killer,u,killer)) south_pigs_comming_to_kill_you(pig[u].next,killer);
    bool sb=run(u,'K',killer);
    if(u==0&&sb==0) pig[killer].be_think=1;
    south_pigs_comming_to_kill_you(pig[u].next,killer);
}
void thousands_of_arrows_shoot_together(int u,int killer){
    if(u==killer) return;
    if(no_relaxation_for_you_to_attack(killer,u,killer)) south_pigs_comming_to_kill_you(pig[u].next,killer);
    bool sb=run(u,'D',killer);
    if(u==0&&sb==0) pig[killer].be_think=1;
    south_pigs_comming_to_kill_you(pig[u].next,killer);
}
void I_kill_you_and_you_kill_me_mxbc_tianmimi(int u,int killer){
    //cout<<"juedou*1\n";
    if(killer==0&&pig[u].charactor=='Z'){
        lose_hp(u,killer);
        return;
    }
    bool sb=run(u,'D',killer);
    if(sb){
        south_pigs_comming_to_kill_you(killer,u);
    }
}
/*------------------------------------------------------------------------------------------------------*/
//全局操作
int gameover(){
    if(pig[0].is_dead){
        result=-1;return 1;
    }
    int u=pig[0].next;
    for(;u;u=pig[u].next){
        if(pig[u].charactor=='F') return 0;
    }
    result=1;
    return 1;
}
void huihe(int p){
    //cout<<p<<"'s turn,it's "<<pig[p].charactor<<" pig,hp "<<pig[p].hp<<" like fan "<<pig[p].be_think<<"\n";
    if(gameover()) return;
    getcard(p,2);
    int ctnue=1,usekill=0; 
    while(ctnue&&!pig[p].is_dead){ //操作了就持续循环
        ctnue=0;
        for(int i=0;i<pig[p].card.size();i++){
            char now=pig[p].card[i];
            if(now=='K'&&(pig[p].pig_bro||!usekill)){
                if(kill(p,pig[p].next,i)){
                    usekill=1;
                    ctnue=1;
                    break;
                }
            }
            else if(now=='P'){
                if(peach(p,i)){
                    ctnue=1;
                    break;
                }
            }
            else if(now=='N'){
                pig[p].card.erase(i,1);ctnue=1;
                south_pigs_comming_to_kill_you(pig[p].next,p);
            }
            else if(now=='W'){
                pig[p].card.erase(i,1);ctnue=1;
                thousands_of_arrows_shoot_together(pig[p].next,p);
            }
            else if(now=='F'){
                if(pig[p].charactor=='F'){
                    pig[p].card.erase(i,1);pig[p].show=1;pig[p].be_think=0;
                    if(!no_relaxation_for_you_to_attack(p,0,p)) I_kill_you_and_you_kill_me_mxbc_tianmimi(0,p);
                    ctnue=1;break;
                }
                else if(pig[p].charactor=='Z'){
                    int v=pig[p].next,have_use=0;
                    for(;v;v=pig[v].next){
                        if(pig[v].charactor=='F'&&pig[v].show==1){
                            pig[p].card.erase(i,1);pig[p].show=1;pig[p].be_think=0;
                            if(!no_relaxation_for_you_to_attack(p,v,p)) I_kill_you_and_you_kill_me_mxbc_tianmimi(v,p);
                            break;
                        }
                    }
                    if(have_use){
                        ctnue=1;break;
                    }
                }
                else{
                    //cout<<"zunbei "<<i<<"\n";
                    int v=pig[p].next,have_use=0;
                    for(;v;v=pig[v].next){
                        if((pig[v].charactor=='F'&&pig[v].show)||pig[v].be_think){
                            pig[p].card.erase(i,1);pig[p].be_think=0;
                            if(!no_relaxation_for_you_to_attack(p,v,p)) I_kill_you_and_you_kill_me_mxbc_tianmimi(v,p);
                            have_use=1;
                            break;
                        }
                    }
                    if(have_use){
                        ctnue=1;break;
                    }
                }
            }
            else if(now=='Z'){
                pig[p].card.erase(i,1);
                pig[p].pig_bro=1;ctnue=1;
            }
        }
    }
    huihe(pig[p].next);
}
/*------------------------------------------------------------------------------------------------------*/
signed main(){
    ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    cin>>n>>m;
    char c;
    for(int i=0;i<n;i++){
        pig[i].last=(i-1+n)%n;
        pig[i].next=(i+1+n)%n;
        cin>>pig[i].charactor;
        cin>>c;
        for(int j=1;j<=4;j++) cin>>c,pig[i].card+=c;
    }
    for(int i=1;i<=m;i++){
        cin>>c;
        all+=c;
    }
    for(int i=1;i<=2000;i++) all+=c;
    huihe(0);
    if(result==1){
        cout<<"MP\n";
    }
    else{
        cout<<"FP\n";
    }
    for(int i=0;i<n;i++){
        if(pig[i].is_dead) cout<<"DEAD\n";
        else{
            for(auto c:pig[i].card) cout<<c<<" ";
            cout<<"\n";
        }
    }
}
2024/10/21 11:37
加载中...