#5求条
查看原帖
#5求条
1449680
ZY_king_YB楼主2025/7/23 11:07
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int zhiye[21]/*其中狼人用 1 表示,平民用 2 表示,猎人用 3 表示,女巫用 4 表示。*/,sw[21],_lrd[21],nvd[21],nvj[21],_nv[21],lie[21],_dws[21];
int t,n;
void Tian_Hei_Qing_Bi_Yan(){
    int m;
    cin>>m;
    bool f=1;
    int SW[21],NVD[21],NVJ[21],LIE[21];
    for(int i=1;i<=n;i++){
        SW[i]=sw[i];
        NVD[i]=nvd[i];
        NVJ[i]=nvj[i];
        LIE[i]=lie[i];
    }
    memset(_lrd,0,sizeof(_lrd));
    memset(_nv,0,sizeof(_nv));
    memset(_dws,0,sizeof(_dws));
    for(int i=1;i<=m;i++){
        int k,id1,id2;
        cin>>k>>id1>>id2;
        if(!f)continue;
        if(id1>n||id2>n){//id不存在
            f=0;
            continue;
        }
        switch(k){
            case 0://狼人杀人
                if(zhiye[id1]!=1){//职业不对
                    f=0;
                    break;
                }
                if(id1==id2){//杀自己
                    f=0;
                    break;
                }
                if(_lrd[id1]){//多次
                    f=0;
                    break;
                }
                if(sw[id2]){//杀死人
                    f=0;
                    break;
                }
                _lrd[id1]=1;
                sw[id2]=1;
                _dws[id2]=1;
                break;
            case 1://女巫毒人
                if(zhiye[id1]!=4){
                    f=0;
                    break;
                }
                if(id1==id2){//杀自己
                    f=0;
                    break;
                }
                if(_nv[id1]){//多次
                    f=0;
                    break;
                }
                if(!nvd[id1]){//无毒
                    f=0;
                    break;
                }
                if(sw[id2]){//杀死人
                    f=0;
                    break;
                }
                _nv[id1]=1;
                nvd[id1]=0;
                sw[id2]=1;
                _dws[id2]=1;
                break;
            case 2://女巫救人
                if(zhiye[id1]!=4){
                    f=0;
                    break;
                }
                if(_nv[id1]){//多次
                    f=0;
                    break;
                }
                if(!nvj[id1]){//无解
                    f=0;
                    break;
                }
                if(sw[id1]&&id1!=id2){//舍己为人
                    f=0;
                    break;
                }
                if(!sw[id2]){//救活人
                    f=0;
                    break;
                }
                if(!_dws[id2]){//非当晚死
                    f=0;
                    break;
                }
                if(zhiye[id2]==3){//救猎人
                    lie[id2]=0;//清零猎人带人个数
                }
                _nv[id1]=1;
                nvj[id1]=0;
                sw[id2]=0;
                _dws[id2]=0;
                break;
            case 3://猎人带人
                if(zhiye[id1]!=3){
                    f=0;
                    break;
                }
                if(sw[id2]){//带死人
                    f=0;
                    break;
                }
                if(id1==id2){//带自己
                    f=0;
                    break;
                }
                if(lie[id1]){//带多人
                    f=0;
                    break;
                }
                if(!sw[id1]){//没死
                    f=0;
                    break;
                }
                lie[id1]=1;
                sw[id2]=1;
                _dws[id2]=1;
                break;
        }
    }
    for(int i=1;i<=n;i++){
        if(zhiye[i]==3&&!lie[i]){
            f=0;
        }
    }
    if(!f){
        for(int i=1;i<=n;i++){
            sw[i]=SW[i];
            nvd[i]=NVD[i];
            nvj[i]=NVJ[i];
            lie[i]=LIE[i];
        }
        cout<<"Wrong\n";
    }
    else {
        int x=0,list[21];
        for(int i=1;i<=n;i++){
            if(_dws[i]){
                list[++x]=i;
            }
        }
        if(!x){
            cout<<"Safe\n";
        }
        else {
            cout<<x;
            sort(list+1,list+1+x);
            for(int i=1;i<=x;i++){
                cout<<" "<<list[i];
            }
            cout<<"\n";
        }
    }
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>t>>n;
    memset(sw,0,sizeof(sw));
    for(int i=1;i<=n;i++){
        cin>>zhiye[i];
        if(zhiye[i]==4){
            nvj[i]=1;
            nvd[i]=1;
        }
        if(zhiye[i]==3){
            lie[i]=0;
        }
    }
    while(t--){
        Tian_Hei_Qing_Bi_Yan();
    }
    return 0;
}

已经是第二次打这题了,要崩溃了 TvT

2025/7/23 11:07
加载中...