考试的时候一点思路都没有
其实可以枚举
就是只要枚举两个狼人的情况
再判断这个是否正确
即两种说谎情况
①指证是狼人但是是民
②指证是民但是是狼人
然后两个说谎情况都要判断指证的人是狼还是民
判断说谎的人数是否大于2
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1010
int p[maxn];
int main()
{
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&p[i]);
}
int cnt1;
int cnt2;
for(int i=1;i<=m;i++)
{
for(int j=i+1;j<=m;j++)
{
cnt1=cnt2=0;
bool flag=true;
for(int k=1;k<=m;k++)
{
if(p[k]<0)//是狼但是民的情况才说谎
{
if(-p[k]!=i&&-p[k]!=j)//判断k这个民(或狼)说的到底是狼还是民(此处是民),所以k说谎了
{
if(k!=i&&k!=j)//判断k是狼还是民(此处是民)
{
cnt1++;
}
if(cnt1+cnt2>2)
{
flag=false;
break;
}
if(k==i||k==j)
{
cnt2++;
}
if(cnt1+cnt2>2)
{
flag=false;
break;
}
}
}
else //是民但是狼的情况才说谎
{
if(p[k]==i||p[k]==j)
{
if(k!=i&&k!=j)//判断k是狼还是民(此处是民)
{
cnt1++;
}
if(cnt1+cnt2>2)
{
flag=false;
break;
}
if(k==i||k==j)
{
cnt2++;
}
if(cnt1+cnt2>2)
{
flag=false;
break;
}
}
}
}
if(flag==true&&cnt2==1&&cnt1+cnt2==2)
{
printf("%d %d\n",i,j);
return 0;
}
}
}
printf("No Solution\n");
//return 0;
}