乙级PAT1089 狼人杀-简单版 (20 分)

解析:这道题有个很重要的信息点:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎

言外之意就是只有一个狼人撒谎,继而推出有一个好人撒谎。(总共2人说的不是实话)

思路:于是我们创建2个数组,第一个数组a用来存储输入的数据,第二个数组b用来枚举狼人和好人。

我们只需判断狼人撒谎次数为1,好人撒谎次数为1,那么结果就出来了。

#include 
#include 
#include 
#include 
#include 
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<

 

你可能感兴趣的:(PAT乙级)