为什么会CE
查看原帖
为什么会CE
464732
luqyou楼主2023/5/27 22:56
#include<bits/stdc++.h>
using namespace std;
int n,m;
int inv(int fr,int kd);
int findinv(int st,int kd);
void kill(int fr,int to);
void duel(int fr,int to);
void check();
void end(int result);
struct SCARDS{
    char cds[2005];int tp;
    char give()
    {
        if(tp==m)return cds[m];
        return cds[tp++];
    }
}cards;
struct SPIG{
    int hp,cnt,num;char card[2005],id[5];
    bool crossbow,antilike,anti,faith,dead;
    SPIG *last,*nx;
    void getcard(){card[++cnt]=cards.give();}
    void getcard(char cd){card[++cnt]=cd;}
    bool known(){return (anti||faith);}
    bool has(char cd){
        for(int i=1;i<=cnt;i++)
            if(card[i]==cd)return 1;
        return 0;
    }
    void use(char cd){
        for(int i=1;i<=cnt;i++)
            if(card[i]==cd){card[i]='x';return;}
    }
    void extort(char crd){
        SPIG* pt=nx;
        while(pt!=this){
            int k=0;
            if(pt->anti)k=findinv(num,0);
            if(pt->faith)k=findinv(num,1);
            if(k)k=inv(k,(pt->faith));
            if(!k){
                if(pt->has(crd))pt->use(crd);
                else{
                    pt->hurt(num);
                    if(pt->id[1]=='M'&&(!known()))
                        antilike=1;
                }
            }
            pt=pt->nx;
        }
    }
    void play(){
        getcard();getcard();
        bool kl=0;
        for(int i=1;i<=cnt&&(!dead);i++){
            if(card[i]=='x'||card[i]=='D')continue;
            if(card[i]=='Z')card[i]='x',crossbow=1,i=0;
            if(card[i]=='P'&&hp<4)card[i]='x',hp++;
            if(card[i]=='N')card[i]='x',extort('K'),i=0;
            if(card[i]=='W')card[i]='x',extort('D'),i=0;
            if(card[i]=='K'&&((!kl)||crossbow)){
                if(id[1]=='M')
                    if(nx->antilike||nx->anti)
                        card[i]='x',kill(num,nx->num),kl=1,i=0;
                if(id[1]=='Z')
                    if(nx->anti)
                        card[i]='x',kill(num,nx->num),kl=1,i=0;
                if(id[1]=='F')
                    if((nx->faith)||(nx->id[1]=='M'))
                        card[i]='x',kill(num,nx->num),kl=1,i=0;
            }
            if(card[i]=='F'){
                if(id[1]=='M'){
                    SPIG *pt=nx;
                    while(pt!=this){
                        if((pt->antilike)||(pt->anti)){
                            card[i]='x';
                            duel(num,pt->num),i=0;
                            break;
                        }
                        pt=(pt->nx);
                    }
                }
                if(id[1]=='Z'){
                    SPIG *pt=nx;
                    while(pt!=this){
                        if(pt->anti){
                            card[i]='x';
                            duel(num,pt->num),i=0;
                            break;
                        }
                        pt=(pt->nx);
                    }
                }
                if(id[1]=='F')card[i]='x',duel(num,1),i=0;
            }
        }
    }
    bool save(){
        if(has('P'))return use('P'),hp++,1;
        return 0;
    }
    void hurt(int cause);
}pig[15];
void SPIG::hurt(int cause){
    hp--;
    if(hp)return;
    if(save())return;
    dead=1;
    check();
    last->nx=nx;nx->last=last;
    if(pig[cause].dead)return;
    if(id[1]=='Z'&&pig[cause].id[1]=='M'){
        for(int i=1;i<=pig[cause].cnt;i++)
            pig[cause].card[i]='x';
        pig[cause].crossbow=0;
    }
    if(id[1]=='F')
        for(int i=1;i<=3;i++)
            pig[cause].getcard();
}
void kill(int fr,int to){
    if(pig[to].has('D'))pig[to].use('D');
    else pig[to].hurt(fr);
    if(pig[to].id[1]=='M'||pig[to].faith)
        pig[fr].anti=1;
    if(pig[to].anti)
        pig[fr].faith=1,pig[fr].antilike=0;
}
void duel(int fr,int to){
    if(pig[fr].id[1]=='M'&&pig[to].id[1]=='Z'){
        pig[to].hurt(fr);
        return;
    }
    int k=0;
    if(pig[fr].id[1]!='M'){
        if(pig[to].anti)pig[fr].faith=1,pig[fr].antilike=0;
        else pig[fr].anti=1;
    }
    if(pig[to].anti)k=findinv(fr,0);
    if(pig[to].faith)k=findinv(fr,1);
    if(k)k=inv(k,pig[to].faith);
    if(!k){
        int fir=to,sec=fr;
        while(1){
            if(pig[fir].has('K'))
                pig[fir].use('K'),fir^=sec^=fir^=sec;
            else
                {pig[fir].hurt(sec);break;}
        }
    }
}
int inv(int fr,int kd){
    pig[fr].use('J');
    if(kd)pig[fr].faith=1,pig[fr].antilike=0;
    else pig[fr].anti=1;
    int k=findinv(fr,1-kd);
    if(k)return 1-inv(k,1-kd);
    else return 1;
}
int findinv(int st,int kd){
    SPIG* pt=&pig[st];
    do{
        if((!kd)&&pt->id[1]=='F'&&pt->has('J'))
            return pt->num;
        if(kd&&(pt->id[1]=='Z'||pt->id[1]=='M')&&pt->has('J'))
            return pt->num;
        pt=pt->nx;
    }while(pt->num!=st);
    return 0;
}
void check(){
    bool good=0,bad=0;
    for(int i=1;i<=n;i++){
        if(pig[i].id[1]=='M'&&pig[i].dead)end(0);
        if(!pig[i].dead){
            if(pig[i].id[1]=='F')bad=1;
            else good=1;
        }
        if(good&&bad)return;
    }
    end(good);
}
void end(int result){
    if(result)printf("MP\n");
    else printf("FP\n");
    for(int i=1;i<=n;i++){
        if(pig[i].dead)printf("DEAD");
        else
            for(int j=1;j<=pig[i].cnt;j++)
                if(pig[i].card[j]!='x')
                    printf("%c ",pig[i].card[j]);
        printf("\n");
    }
    exit(0);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",pig[i].id+1);
        for(int j=1;j<=4;j++){
            char cd[5];
            scanf("%s",cd+1);
            pig[i].getcard(cd[1]);
        }
        pig[i].hp=4;pig[i].num=i;
        if(i==n)pig[i].nx=&pig[1];
        else pig[i].nx=&pig[i+1];
        if(i==1)pig[i].last=&pig[n];
        else pig[i].last=&pig[i-1];
    }
    pig[1].faith=1;cards.tp=1;
    for(int i=1;i<=m;i++){
        char tmp[5];
        scanf("%s",tmp+1);
        cards.cds[i]=tmp[1];
    }
    check();
    while(1)
        for(int i=1;i<=n;i++)
            if(!pig[i].dead)pig[i].play();
    return 0;
}
2023/5/27 22:56
加载中...