1148 Werewolf - Simple Version

在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意:

一个狼人杀游戏,已知肯定有两头狼,其中有一头说谎,然后平民里也有一个说谎,要求找出这两头狼的编号,如果存在多个解输出字典序最小的。

解题思路:

由于数据量并不大直接暴力枚举两头狼的编号即可,维护一个身份数组,在枚举狼时将对应的下标下的数组值变为-1,其他下标是1。然后遍历每个人说的话,如果出现矛盾(所说的人的身份和我们ID数组中对应的矛盾)说明这个人说谎,将说谎人的编号保存下来,如果最后有两个人说谎并且一个是狼一个是平民,就输出答案。从小到大枚举狼可以解决字典序的问题。
代码如下:

#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<deque>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
//vector ::iterator it;
//set<int>::iterator iter;
//fill(function+begin.,function+length,key);
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  //freopen("test.txt","r",stdin);
  //freopen("output.txt","w",stdout);
	int n,word[110]={0},id[110];
	cin>>n;
	for(int i=1;i<=n;i++)cin>>word[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			fill(id+1,id+n+1,1);//身份数组初始化
			id[i]=id[j]=-1;//标记两头狼
			vector<int> v;//保存说谎者ID
			for(int t=1;t<=n;t++)
			{
				if(word[t]*id[abs(word[t])]<0)
					v.push_back(t);//保存说谎者编号
			}
			if(v.size()==2&&id[v[0]]+id[v[1]]==0)//说谎人数为2且一个是狼一个是民
			{
				cout<<i<<' '<<j<<endl;
				return 0;
			}
		}
	}
	cout<<"No Solution"<<endl;
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值