90分求调
查看原帖
90分求调
1312687
luogu_li4zi3楼主2024/12/28 22:48

code(WA on #17 & #21):

#include<iostream>
#include<algorithm>
using namespace std;
struct player {
    bool eq;//equipped
    int hp,size,next,last,id,behave;
    char hand[2010];
}players[11];
int n,m,cnt,top;
char cards[2010];
bool is_end;
void draw(int p,int num) {
    while(num--) {
        players[p].hand[++players[p].size]=cards[top];
        if(top>1)top--;
    }
}
void dying(int pre,int nxt) {
    for(int i=1;i<=players[nxt].size;i++) {
        if(players[nxt].hand[i]=='P') {
            players[nxt].hand[i]='0';
            players[nxt].hp++;
            return;
        }
    }
    players[players[nxt].next].last=players[nxt].last;
    players[players[nxt].last].next=players[nxt].next;
    if(players[nxt].id==3)cnt--;
    if(!cnt||players[nxt].id==1) {
        is_end=true;
        return;
    }
    if(players[nxt].id==3)draw(pre,3);
    if(players[nxt].id==2&&players[pre].id==1) {
        players[pre].size=0;
        players[pre].eq=false;
    }
}
void atk(int pre,int nxt) {
    for(int i=1;i<=players[nxt].size;i++) {
        if(players[nxt].hand[i]=='D') {
            players[nxt].hand[i]='0';
            return;
        }
    }
    players[nxt].hp--;
    if(!players[nxt].hp)dying(pre,nxt);
}
bool parry(int pre,int nxt,int flag) {
    int i=pre;
    do {
        if(flag) {
            if(players[nxt].behave==players[i].id||(players[nxt].behave==1&&players[i].id==2)||(players[nxt].behave==2&&players[i].id==1)) {
                for(int j=1;j<=players[i].size;j++) {
                    if(players[i].hand[j]=='J') {
                        players[i].hand[j]='0';
                        players[i].behave=players[i].id;
                        return !parry(i,pre,0);
                    }
                }
            }
        }else {
            if(((players[i].id==1||players[i].id==2)&&players[pre].behave==3)||(players[i].id==3&&(players[pre].behave==1||players[pre].behave==2))) {
                for(int j=1;j<=players[i].size;j++) {
                    if(players[i].hand[j]=='J') {
                        players[i].hand[j]='0';
                        players[i].behave=players[i].id;
                        return !parry(i,pre,0);
                    }
                }
            }
        }
        i=players[i].next;
    }while(i!=pre);
    return false;
}
void duel(int pre,int nxt) {
    if(parry(pre,nxt,1))return;
    if(players[pre].id==1&&players[nxt].id==2) {
        players[nxt].hp--;
        if(players[nxt].hp<=0)dying(pre,nxt);
        return;
    }
    int l=1,r=1;
    while(true) {
        while(r<=players[nxt].size&&players[nxt].hand[r]!='K')r++;
        if(r>players[nxt].size) {
            players[nxt].hp--;
            if(players[nxt].hp<=0)dying(pre,nxt);
            return;
        }else players[nxt].hand[r]='0';
        while(l<=players[pre].size&&players[pre].hand[l]!='K')l++;
        if(l>players[pre].size) {
            players[pre].hp--;
            if(players[pre].hp<=0)dying(nxt,pre);
            return;
        } else players[pre].hand[l]='0';
    }
}
void south_invade(int pre) {
    int j;
    for(int i=players[pre].next;i!=pre;i=players[i].next) {
        if(parry(pre,i,1))continue;
        for(j=1;j<=players[i].size;j++) {
            if(players[i].hand[j]=='K') {
                players[i].hand[j]='0';
                break;
            }
        }
        if(j>players[i].size) {
            players[i].hp--;
            if(players[i].id==1&&!players[pre].behave)players[pre].behave=4;
            if(players[i].hp<=0)dying(pre,i);
            if(is_end)return;
        }
    }
}
void shoot_at_once(int pre) {
    int j;
    for(int i=players[pre].next;i!=pre;i=players[i].next) {
        if(parry(pre,i,1))continue;
        for(j=1;j<=players[i].size;j++) {
            if(players[i].hand[j]=='D') {
                players[i].hand[j]='0';
                break;
            }
        }
        if(j>players[i].size) {
            players[i].hp--;
            if(players[i].id==1&&!players[pre].behave)players[pre].behave=4;
            if(players[i].hp<=0)dying(pre,i);
            if(is_end)return;
        }
    }
}
void mainloop() {
    if(!cnt)return;
    int i=0;
    bool used=false;
    while(!is_end) {
        draw(i,2);
        for(int j=1;j<=players[i].size;j++) {
            if(players[i].hand[j]=='0'||players[i].hand[j]=='D')continue;
            if(!players[i].hp)break;
            if(players[i].hand[j]=='P') {
                if(players[i].hp<4) {
                    players[i].hp++;
                    players[i].hand[j]='0';
                }
                continue;
            }
            if(players[i].hand[j]=='K') {
                if(used&&!players[i].eq)continue;
                if((players[i].id==1&&players[players[i].next].behave!=3&&players[players[i].next].behave!=4)||(players[i].id==2&&players[players[i].next].behave!=3)||(players[i].id==3&&players[players[i].next].behave!=1&&players[players[i].next].behave!=2))continue;
                players[i].hand[j]='0';
                atk(i,players[i].next);
                players[i].behave=players[i].id;
                used=true;
                if(is_end)return;
                continue;
            }
            if(players[i].hand[j]=='F') {
                if(players[i].id==3) {
                    players[i].hand[j]='0';
                    duel(i,0);
                    players[i].behave=players[i].id;
                    if(is_end)return;
                    j=0;
                }else {
                    int k=players[i].next;
                    while(k!=i) {
                        if((players[i].id==1&&players[k].behave>=3)||(players[i].id==2&&players[k].behave==3)) {
                            players[i].hand[j]='0';
                            duel(i,k);
                            players[i].behave=players[i].id;
                            if(is_end)return;
                            j=0;
                            break;
                        }
                        k=players[k].next;
                    }
                }
                continue;
            }
            if(players[i].hand[j]=='N') {
                players[i].hand[j]='0';
                south_invade(i);
                if(is_end)return;
                j=0;
                continue;
            }
            if(players[i].hand[j]=='W') {
                players[i].hand[j]='0';
                shoot_at_once(i);
                if(is_end)return;
                j=0;
                continue;
            }
            if(players[i].hand[j]=='Z') {
                players[i].hand[j]='0';
                players[i].eq=true;
                j=0;
            }
        }
        i=players[i].next;
    }
}
int main() {
    cin>>n>>m;
    for(int i=0;i<n;i++) {
        players[i].size=players[i].hp=4;
        players[i].behave=0;
        string s;
        cin>>s;
        if (s[0]=='M')players[i].id=players[i].behave=1;
        if (s[0]=='Z')players[i].id=2;
        if (s[0]=='F'){
            players[i].id=3;
            cnt++;
        }
        players[i].eq=false;
        players[i].last=(i-1+n)%n;
        players[i].next=(i+1)%n;
        for(int j=1;j<=4;j++) {
            cin>>s;
            players[i].hand[j]=s[0];
        }
    }
    for(int i=1;i<=m;i++) {
        string s;
        cin>>s;
        cards[i]=s[0];
    }
    reverse(cards+1,cards+m+1);
    top=m;
    mainloop();
    if(players[0].hp<=0)cout<<"FP"<<endl;
    else cout<<"MP"<<endl;
    for(int i=0;i<n;i++) {
        if(players[i].hp<=0)cout<<"DEAD"<<endl;
        else {
            for(int j=1;j<=players[i].size;j++)
                if(players[i].hand[j]!='0')
                    cout<<players[i].hand[j]<<' ';
            cout<<endl;
        }
    }
    return 0;
}
2024/12/28 22:48
加载中...