PAT 1089 狼人杀-简单版 20分 知识点:枚举

92 阅读1分钟

题目:1089 狼人杀-简单版 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:89_哔哩哔哩_bilibili

重点在于有两个狼人,两个人说谎,不是所有的狼人说谎,所以我们可以得出一个结论:

一个狼人说谎一个好人说谎

我们枚举两个狼人,首先把要枚举的位置设为-1代表狼人,说过输入的值和对应的位置的值相乘是-1,说明说谎了。

#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{

    int n=0;cin>>n;   
    for(int i=1;i<=n;i++)    cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        { 
            vector<int> v(n+1,1); //注意n+1,下标从1开始
            v[i]=-1,v[j]=-1; 
            vector<int>lie;
            for(int k=1;k<=n;k++)
            {   
                if(a[k]*v[abs(a[k])]<0)
                {
                    lie.push_back(v[k]);
                }
            }   
            if(lie.size()==2&&lie[0]+lie[1]==0)
                {
                    cout<<i<<" "<<j<<endl;
                    return 0;  //一定要return 0;提前把值返回了,不会最后还是会执行"No solution"
                }
        }
    }
cout<<"No Solution";
    return 0;
}

image.png