玄关求条
查看原帖
玄关求条
1385113
LiQiRong__juruo楼主2025/1/22 22:13
#include <bits/stdc++.h>
using namespace std;
struct name{
    int s; // 角色
    bool die = 0; // 是否死亡
    int j = 1,d = 1; // 解药和毒药
    int bi = 1; // 狼人使用次数
    int lier = 1; // 猎人逝时使用次数
    //后面加零的是上一轮的
    bool die0 = 0;
    int j0 = 1,d0 = 1;
    int bi0 = 1;
    int qita = 0;
}a[21];
int t,n;
void Wrong(){
    cout << "Wrong\n";
    for(int i = 1;i <= n;i++){
        a[i].qita = 0;
        a[i].die = a[i].die0;
        a[i].j = a[i].j0;
        a[i].d = a[i].d0;
        a[i].bi = 1;
    }
}
int main(){
    
    cin >> t>>n;
    for(int i = 1;i <= n;i++){
        cin >> a[i].s;
    }
    while(t--){
        int m;
        cin >> m;
        int f = 1;
        for(int i = 1;i <= m;i++){ 
            int op,idx1,idx2;
            cin >> op>>idx1>>idx2;
            if(idx1 < 1 || idx1 > n ||idx2 < 1 ||idx2 > n){ // 如果输入的序号不合法
                Wrong();
                f = 0;
                break;
            }
            if(a[idx1].s == 2){ // 如果是平民,不能释放技能
                Wrong();
                f = 0;
                break;
            }
            if(op == 0){
                if(a[idx2].die == 1){
                    Wrong();
                    f = 0;
                    break;
                }
                if(idx1 == idx2){ //不能自己~刀自己~
                    Wrong();
                    f = 0;
                    break;
                }
                if(a[idx1].die == 1){//亡魂不能刀人
                    Wrong();
                    f = 0;
                    break;
                }
                if(a[idx1].s == 1 && a[idx1].bi == 1){//检查身份
                    a[idx2].die = 1;
                    a[idx1].bi = 0;
                }else{
                    Wrong();
                    f = 0;
                    break;
                }
            }else if(op == 1){
                if(a[idx2].die == 1){
                    Wrong();
                    f = 0;
                    break;
                }
                if(a[idx1].die == 1){
                    Wrong();
                    f = 0;
                    break;
                }
                if(a[idx1].s == 4 && a[idx1].d == 1){
                    if(idx1 == idx2){ //不能自己~刀自己~
                        Wrong();
                        f = 0;
                        break;
                    }else{
                        if(a[idx1].qita){
                            Wrong();
                            f = 0;
                            break;
                        }
                        a[idx1].qita = 1;
                        a[idx2].die = 1;
                        a[idx1].d = 0;
                    }
                }else{
                    Wrong();
                    f = 0;
                    break;
                }
            }else if(op == 2){
                if(a[idx1].s == 4 && a[idx1].j == 1){
                    if(a[idx2].die != 1 || (a[idx2].die == 1 && a[idx2].die0 == 1)){
                        Wrong();
                        f = 0;
                        break;
                    }else{
                        if(a[idx1].die && idx1 != idx2){
                            Wrong();
                            f = 0;
                            break;
                        }
                        if(a[idx1].qita){
                            Wrong();
                            f = 0;
                            break;
                        }
                        a[idx2].lier = 1;
                        a[idx1].qita = 1;
                        a[idx2].bi = a[idx2].bi;
                        a[idx2].j = a[idx2].j0;
                        a[idx2].d = a[idx2].d0;
                        a[idx2].die = 0;
                        a[idx1].j = 0;
                    }
                }else{
                    Wrong();
                    f = 0;
                    break;
                }
            }else if(op == 3){
                if(a[idx2].die == 1){
                    Wrong();
                    f = 0;
                    break;
                }
                if(a[idx1].die == 0 || a[idx1].lier == 0){
                    Wrong();
                    f = 0;
                    break;
                }else{
                    if(idx1 == idx2){  //不能自己~刀自己~
                        Wrong();
                        f = 0;
                        break;
                    }
                    a[idx2].die = 1;
                    a[idx1].lier = 0;
                }
            }
        }
        for(int i = 1;i <= n;i++){
            if(a[i].s == 3){
                if(a[i].die == 1){
                    if(a[i].lier == 1){
                        Wrong();
                        f = 0;
                        break;
                    }
                }
            }
        }
        
        if(f){
            int sum = 0;
            for(int i = 1;i <= n;i++){
                if(a[i].die == 1 && a[i].die0 == 0){
                    sum++;
                }
            }
            if(sum == 0){
                cout << "Safe";
            }else{
                cout << sum<<' ';
                for(int i = 1;i <= n;i++){
                    if(a[i].die == 1 && a[i].die0 == 0){
                        cout <<i<< ' ';
                    }
                }
            }
            cout << '\n';
            
        }
        for(int i = 1;i <= n;i++){
            a[i].qita = 0;
            a[i].die0 = a[i].die;
            a[i].j0 = a[i].j;
            a[i].d0 = a[i].d;
            a[i].bi = 1;
        }
    }
}
2025/1/22 22:13
加载中...