为什么T了?
查看原帖
为什么T了?
322792
Alea楼主2023/8/30 16:54
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
struct pig{
    //id: 0,MP;1,ZP;-1,FP. glid: 0,Un;1,Has;-1,Liked-FP.
    int id,glid;
    int prev,next;
    int noc,hp;
    char card[1010];
    bool used[1010],aed,aliv;
    pig(){;}
    pig(string id,char c1,char c2,char c3,char c4,int num){
        memset(card,0,sizeof card),memset(used,0,sizeof used);
        glid=0;
        if(id=="MP") this->id=0,glid=1;
        else if(id=="ZP") this->id=1;
        else if(id=="FP") this->id=-1;
        prev=num-1,next=num+1;
        card[1]=c1,card[2]=c2,card[3]=c3,card[4]=c4,noc=4;
        hp=4,aed=false,aliv=true;
    }
    void debug(){
        switch(id){
        case -1:cerr<<"FP ";break;
        case 0:cerr<<"MP ";break;
        case 1:cerr<<"ZP ";break;
        }
        switch(glid){
        case -1:cerr<<"FPL"<<endl;break;
        case 0:cerr<<"Hasn't"<<endl;break;
        case 1:cerr<<"Has done"<<endl;break;
        }
        cerr<<hp<<" "<<aliv<<" "<<aed<<endl;
        for(int i=1;i<=noc;i++) if(!used[i]) cerr<<card[i]<<" ";
        cerr<<endl;
    }
}pigs[15];
int n,m,k=0,cur,endgm=0,ctfp=0,clmk=0;
char cardq[2010]={};
void getcard(int num){
    if(k!=m) k++;
    pigs[num].card[++pigs[num].noc]=cardq[k];
}
bool useP(int num){
    if(pigs[num].hp<4){
        cerr<<"pig "<<num<<"-th use P!"<<endl;
        pigs[num].hp++;
        return true;
    }
    return false;
}
bool useZ(int num){
    cerr<<"pig "<<num<<"-th use Z!"<<endl;
    pigs[num].aed=true;
    return true;
}
void useD(int num){
    for(int i=1;i<=pigs[num].noc;i++){
        if(pigs[num].card[i]=='D'&&!pigs[num].used[i]){
            cerr<<"Pig "<<num<<"-th use D!"<<endl;
            pigs[num].used[i]=true;
            return;
        }
    }
    cerr<<"Pig "<<num<<"-th lose 1 hp!"<<endl;
    pigs[num].hp--;
}
void die(int num,int frm){
    for(int i=1;i<=pigs[num].noc;i++){
        if(pigs[num].card[i]=='P'&&!pigs[num].used[i]){
            pigs[num].hp++,pigs[num].used[i]=true;
            if(pigs[num].hp>0){
                cerr<<"Pig "<<num<<"-th use P to survive!"<<endl;
                return;
            }
        }
    }
    if(pigs[num].hp<=0){
        cerr<<"Pig "<<num<<"-th DIES!"<<endl;
        pigs[num].aliv=false;
        pigs[pigs[num].prev].next=pigs[num].next,pigs[pigs[num].next].prev=pigs[num].prev;
        if(pigs[num].id==0){
            endgm=-1;
            return;
        }
        if(pigs[num].id==-1){
            ctfp--;
            if(ctfp==0){
                endgm=1;
                return;
            }
            cerr<<"Pig "<<frm<<"-th get 3 cards!"<<endl;
            getcard(frm),getcard(frm),getcard(frm);
        }
        if(pigs[num].id==1) if(pigs[frm].id==0){
            cerr<<"Pig "<<frm<<"-th incorrectly killed pig "<<num<<"-th!"<<endl;
            pigs[frm].aed=false,pigs[frm].noc=0;
            memset(pigs[frm].card,0,sizeof pigs[frm].card);
            memset(pigs[frm].used,0,sizeof pigs[frm].used);
            clmk=1;
        }
    }
}
bool useK(int num){
    int trg=pigs[num].next;
    if(pigs[num].id==0){
        if(pigs[trg].glid==-1||(pigs[trg].id==-1&&pigs[trg].glid==1)){
            cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl;
            pigs[num].glid=1;
            useD(trg);
            if(pigs[trg].hp<=0) die(trg,num);
            return true;
        }
    }
    if(pigs[num].id==1){
        if(pigs[trg].glid==1&&pigs[trg].id==-1){
            cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl;
            pigs[num].glid=1;
            useD(trg);
            if(pigs[trg].hp<=0) die(trg,num);
            return true;
        }
    }
    if(pigs[num].id==-1){
        if(pigs[trg].glid==1&&(pigs[trg].id>=0)){
            cerr<<"Pig "<<num<<"-th use K to "<<trg<<"-th pig!"<<endl;
            pigs[num].glid=1;
            useD(trg);
            if(pigs[trg].hp<=0) die(trg,num);
            return true;
        }
    }
    return false;
}
bool useJ(int num,int dsi){
    int now=num;
    do{
        if(pigs[now].id!=-1&&dsi==1){
            for(int i=1;i<=pigs[now].noc;i++){
                if(pigs[now].card[i]=='J'&&!pigs[now].used[i]){
                    cerr<<"Pig "<<now<<"-th use J!"<<endl;
                    pigs[now].used[i]=true;
                    if(pigs[now].glid!=1) pigs[now].glid=1;
                    return !useJ(now,-1);
                }
            }
        }
        if(pigs[now].id==-1&&dsi==-1){
            for(int i=1;i<=pigs[now].noc;i++){
                if(pigs[now].card[i]=='J'&&!pigs[now].used[i]){
                    cerr<<"Pig "<<now<<"-th use J!"<<endl;
                    pigs[now].used[i]=true;
                    if(pigs[now].glid!=1) pigs[now].glid=1;
                    return !useJ(now,1);
                }
            }
        }
        now=pigs[now].next;
    }while(now!=num);
    return false;
}
bool useN(int num){
    cerr<<"Pig "<<num<<"-th use N!"<<endl;
    for(int i=pigs[num].next;i!=num;i=pigs[i].next){
        bool usedK=false;
        if(pigs[i].glid==1) if(useJ(num,pigs[i].id==0?1:pigs[i].id)) continue;
        for(int j=1;j<=pigs[i].noc;j++){
            if(pigs[i].card[j]=='K'&&!pigs[i].used[j]){
                usedK=true,pigs[i].used[j]=true;
                break;
            }
        }
        if(!usedK){
            cerr<<"Pig "<<i<<"-th down 1 hp!"<<endl;
            pigs[i].hp--;
            if(pigs[i].hp<=0) die(i,num);
            if(pigs[i].id==0&&pigs[num].glid==0) pigs[num].glid=-1;
            if(endgm!=0) return true;
        }
        else cerr<<"Pig "<<i<<"-th use K!"<<endl;
    }
    return true;
}
bool useW(int num){
    cerr<<"Pig "<<num<<"-th use W!"<<endl;
    for(int i=pigs[num].next;i!=num;i=pigs[i].next){
        bool usedD=false;
        if(pigs[i].glid==1) if(useJ(num,pigs[i].id==0?1:pigs[i].id)) continue;
        for(int j=1;j<=pigs[i].noc;j++){
            if(pigs[i].card[j]=='D'&&!pigs[i].used[j]){
                usedD=true,pigs[i].used[j]=true;
                break;
            }
        }
        if(!usedD){
            cerr<<"Pig "<<i<<"-th down 1 hp!"<<endl;
            pigs[i].hp--;
            if(pigs[i].hp<=0) die(i,num);
            if(pigs[i].id==0&&pigs[num].glid==0) pigs[num].glid=-1;
            if(endgm!=0) return true;
        }else cerr<<"Pig "<<i<<"-th use D!"<<endl;
    }
    return true;
}
void F(int atk,int dnf){
    cerr<<"Pig "<<atk<<"-th use F to attack pig "<<dnf<<"-th!"<<endl;
    if(atk==1&&pigs[dnf].id==1){
        pigs[dnf].hp--;
        if(pigs[dnf].hp<=0) die(dnf,atk);
        return;
    }
    int now=dnf;
    while(true){
        bool usedK=false;
        for(int i=1;i<=pigs[now].noc;i++){
            if(pigs[now].card[i]=='K'&&!pigs[now].used[i]){
                usedK=true,pigs[now].used[i]=true;
                break;
            }
        }
        if(!usedK){
            cerr<<"Pig "<<now<<"-th lose in F, down 1 hp!"<<endl;
            pigs[now].hp--;
            if(pigs[now].hp<=0) die(now,now==dnf?atk:dnf);
            return;
        }
        now=(now==dnf?atk:dnf);
    }
}
bool useF(int num){
    if(pigs[num].id==-1){
        pigs[num].glid=1;
        bool flg=useJ(num,1);
        cerr<<"Pig "<<num<<"-th use F!"<<endl;
        if(!flg) F(num,1);
        return true;
    }
    if(pigs[num].id==1){
        for(int i=pigs[num].next;i!=num;i=pigs[i].next){
            if(pigs[i].glid==1&&pigs[i].id==-1){
                cerr<<"Pig "<<num<<"-th use F!"<<endl;
                pigs[num].glid=1;
                bool flg=false;
                if(pigs[i].glid==1) flg=useJ(num,-1);
                if(!flg) F(num,i);
                return true;
            }
        }
    }
    if(pigs[num].id==0){
        for(int i=pigs[num].next;i!=num;i=pigs[i].next){
            if((pigs[i].glid==1&&pigs[i].id==-1)||pigs[i].glid==-1){
                cerr<<"Pig "<<num<<"-th use F!"<<endl;
                bool flg=false;
                if(pigs[i].glid==1) flg=useJ(num,-1);
                if(!flg) F(num,i);
                return true;
            }
        }
    }
    return false;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        string d;
        char c[5];
        cin>>d;
        if(d=="FP") ++ctfp;
        for(int j=1;j<=4;j++) cin>>c[j];
        pigs[i]=pig(d,c[1],c[2],c[3],c[4],i);
    }
    pigs[1].prev=n,pigs[n].next=1,cur=1;
    for(int i=1;i<=m;i++) cin>>cardq[i];
    while(true){
        getcard(cur),getcard(cur);
        bool usedK=false;
        for(int i=1;i<=pigs[cur].noc;i++){
            if(!pigs[cur].used[i]){
                bool usedc=false;
                if(pigs[cur].card[i]=='P') usedc=useP(cur);
                if(pigs[cur].card[i]=='Z') usedc=useZ(cur);
                if(pigs[cur].card[i]=='K'&&(!usedK||pigs[cur].aed)) usedK=usedc=useK(cur);
                if(pigs[cur].card[i]=='N') usedc=useN(cur);
                if(pigs[cur].card[i]=='W') usedc=useW(cur);
                if(pigs[cur].card[i]=='F') usedc=useF(cur);
                if(usedc){
                    if(i==1&&clmk) clmk=0;
                    else pigs[cur].used[i]=true;
                    i=0;
                }
            }
            if(!pigs[cur].aliv) break;
            if(endgm!=0) break;
        }
        for(int i=1;i<=n;i++) pigs[i].debug();
        cerr<<"-----------------"<<endl;
        if(endgm!=0) break;
        cur=pigs[cur].next;
    }
    if(endgm==1) cout<<"MP"<<endl;
    else cout<<"FP"<<endl;
    for(int i=1;i<=n;i++){
        if(!pigs[i].aliv) cout<<"DEAD"<<endl;
        else{
            for(int j=1;j<=pigs[i].noc;j++){
                if(!pigs[i].used[j]) cout<<pigs[i].card[j]<<" ";
            }
            cout<<endl;
        }
    }
    return 0;
}

T成90分,很惨烈

另外,cerr不会输出到文件输出流

2023/8/30 16:54
加载中...