PAT A1048 Werewolf - Simple Version [硬核模拟]

题目描述

链接
n个人, n个描述,+5代表5号人是好人,共两个狼人,两个说谎,其中一个是狼人,求可能的方案

分析

  • 编写函数check(i,j), 关键是i j怎么定义!!!定义为说谎者的话,本来考虑不周全,而且要交换i j,因为狼人是其中一个,明显不对!!也走了大弯路
  • 想简单点,直接i,j就是两个狼人。则可以定义b数组,标记好人和坏人,用1和-1标记,标记好后,逐个读入描述a[k],如果b[abs(a[k])] * a[k] < 0 说明与真实情况不一致,则k是说谎者,lie数组加入k。最后判断lie数组size是否为2,且两个人中一个好一个坏,即b[lie[0]] + b[lie[1]] == 0
  • 唉,走偏了!!!

代码

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main() {
    int n;
    cin >> n;
    vector<int> v(n+1);
    for (int i = 1; i <= n; i++) cin >> v[i];
    for (int i = 1; i <= n; i++) {
        for (int j = i + 1; j <= n; j++) {
            vector<int> lie, a(n + 1, 1);
            a[i] = a[j] = -1;
            for (int k = 1; k <= n; k++)
                if (v[k] * a[abs(v[k])] < 0) lie.push_back(k);
            if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) {
                cout << i << " " << j;
                return 0;
            }
        }
    }
    cout << "No Solution";
    return 0;
}

错误

#include<bits/stdc++.h>
using namespace std;


const int maxn = 105;
int a[maxn], n, b[maxn], c[maxn];
pair<int, int> res;

bool cmp(pair<int,int> a, pair<int,int> b){
    if(a.first == b.first) return a.second < b.second;
    return a.first < b.first;
}

bool check(int i, int j){
    memset(b, 0, sizeof(b));
    vector<int> tmp;
    for(int k=1;k<=n;k++) a[k] = c[k]; //初始化
    a[i] = -a[i]; a[j] = -a[j]; //说谎者
    for(int k=1;k<=n;k++){
        if(b[abs(a[k])] == 0){ //未被标记过
            b[abs(a[k])] = a[k]>0?1:-1;
        }
        else if(b[abs(a[k])] != (a[k]>0?1:-1)){
            return false;
        } //两人说法矛盾
    }
    if(b[i] > 0) return false; //有一个必须是狼人
    for(int k=1;k<=n;k++){
        if(b[k]<=0) tmp.push_back(k);
    }
    if(tmp.size() != 2) return false; //狼人数不为2
    res = make_pair(tmp[0], tmp[1]);
    return true;
}


int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c[i];
    }
    bool flag = 0;
    vector<pair<int,int> > ans;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(check(i,j)){
                flag = 1;
                ans.push_back(res);
            }
            if(check(j, i)){
                flag = 1;
                ans.push_back(res);
            }
        }
    }
    if(!flag){
        cout<<"No Solution"<<endl;
    }else{
        sort(ans.begin(), ans.end(), cmp);
        printf("%d %d\n", ans[0].first, ans[0].second);
    }

}

posted @ 2019-09-03 18:43  Doragd  阅读(156)  评论(0编辑  收藏  举报