PAT(甲级)1148 Werewolf - Simple Version(枚举)

Description

狼人杀游戏,第几个人说第几个人是狼人或者是人,规定所有人中有两个狼人,其中只有一个狼人和一个人说谎,要求找出两个狼人

Input

第一行n,代表n个人
接下来n行
正数 Di 代表:第i个人说第Di人是human
负数 Di 代表:第i个人说第Di(绝对值)人是werewolf

Output

输出两个werewolf的下标,一个空格,如果有多个答案,输出最小的序列

解题思路

算法标签:枚举
显然就是枚举任意两个人是狼人,统计n个人说谎的人数,如果说话人数为两人,且一个为狼人另一个为人,当然没有规定这两个人谁是狼人谁是人,只是要求其中一个是狼人,另一个是人就行,遍历从小到大遍历,第一个找到的自然是最小的,无任何算法,不需要任何技巧,简单遍历即可(没玩过狼人杀但是可以百度啊!没吃过猪肉还没见过猪跑嘛)

代码

//freopen("hao.txt","r",stdin);
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;
const int N = 105;
int main()
{
	int n = 0;
	int statement[N] = {0};
	bool isans = false;
	// ture为human,false为werewolf
	bool iswolf[N];
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>statement[i];

	for(int i=1;i<n;i++) {

		for(int j=i+1;j<=n;j++) {
			// 初始化均为human
			memset(iswolf,true,sizeof(iswolf));
			// 创建说谎人的队列,存储下标
			queue<int>liar;
			//cout<<i<<" "<<j<<endl;
			// 认为第i个人和第j个人是狼人,这样就可以保证答案从小到大
			iswolf[i] = false;
			iswolf[j] = false;

			// 寻找有几个人是说谎的,以及说谎人是不是一个werewolf和human
			for(int k=1;k<=n;k++) {
				if((statement[k]>0)&&(iswolf[abs(statement[k])]==false))
					liar.push(k);
				else if((statement[k]<0)&&(iswolf[abs(statement[k])]==true))
					liar.push(k);
			}

			if(liar.size()==2) {
				int liar_a = liar.front();
				int liar_b = liar.back();

				if(iswolf[liar_a]==true && iswolf[liar_b]==false) {
					cout<<i<<" "<<j;
					isans = true;
					break;
				}
				else if(iswolf[liar_a]==false && iswolf[liar_b]==true) {
					cout<<i<<" "<<j;
					isans = true;
					break;
				}
			}
		}
		if(isans)
			break;
	}
	// 判断是否有答案
	if(!isans)
		cout<<"No Solution";
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值