解析:这道题有个很重要的信息点:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。
言外之意就是只有一个狼人撒谎,继而推出有一个好人撒谎。(总共2人说的不是实话)
思路:于是我们创建2个数组,第一个数组a用来存储输入的数据,第二个数组b用来枚举狼人和好人。
我们只需判断狼人撒谎次数为1,好人撒谎次数为1,那么结果就出来了。
#include <iostream>
#include <cstring>
#include <string>
#include <math.h>
#include <algorithm>
using namespace std;
int main(){
int a[111]={0}; //存入输入的信息
memset(a,0,sizeof(a));
int b[111]={0}; //遍历
int i,j,k,n;
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
}
//-2,+3,-4,+5,+4 a
//1 1 0 0 0 b
int flag=0;
int pos_i,pos_j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
memset(b,0,sizeof(b));
if(i==j) continue;
b[i]=1,b[j]=1; //狼人标为1,假设b[i],b[j]都是狼人
int sumL=0; //狼人撒谎次数
if((a[i]>0&&b[abs(a[i])]==0)||(a[i]<0&&b[abs(a[i])]==1)){
}else{ //1号狼人撒谎了
sumL++;
}
if((a[j]>0&&b[abs(a[j])]==0)||(a[j]<0&&b[abs(a[j])]==1)){
}else{ //2号浪人撒谎
sumL++;
}
if(sumL>=2||sumL==0){ //没有狼人撒谎,或者2个狼人都撒谎
continue;
}
int sumH=0; //好人撒谎次数
for(k=1;k<=n;k++){
if(k==i||k==j){ //跳过当前狼人
continue;
}
if((a[k]<0&&b[abs(a[k])]==1)||a[k]>0&&b[abs(a[k])]==0){
}else{ //好人撒谎次数
sumH++;
}
}
if(sumL==1&&sumH==1){ //好人和狼人撒谎各一次
flag=1;
pos_i=i;
pos_j=j;
break;
}
}
if(flag==1){
break;
}
}
if(flag){
if(pos_i>pos_j) swap(pos_i,pos_j);
cout<<pos_i<<" "<<pos_j;
}else{
cout<<"No Solution";
}
return 0;
}