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

本文通过一个狼人杀游戏中的逻辑谜题,详细解析了如何使用编程方法解决复杂的人际关系判断问题。通过创建两个数组分别存储游戏信息和角色状态,利用双重循环遍历所有可能的狼人组合,判断其谎言次数是否符合题目条件,最终找出符合条件的狼人角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析:这道题有个很重要的信息点:已知 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值