PTA 1089 狼人杀-简单版 (c++ 详解)

1089 狼人杀-简单版 (20 分)

在这里插入图片描述
在这里插入图片描述
分析:这道题非常考验你的逻辑思维能力,如果你的逻辑思维很缜密的话,想出来的判断方法也就会很简单。其实这就跟我们平时生活中验证谁说假话一样,假设两个人是狼,然后从头到尾开始判断,如果有两个人说谎并且一个人是假设的狼,一个是好人,则假设成立。具体思路如下:
1.首先给定一个数组用于储存输入的数据,(下标即为个人的编号)
2.建立两个数组,一个是用于储存说谎者,另一个用于模拟(具体操作看代码)
3.双重循环,从头开始(因为如果不唯一要找最小的解)假设两匹狼,然后根据1中的数组对2中的用于模拟的数据进行模拟,如果出现不符则判定说谎存储到说谎者数组中
4.对说谎者数组进行判断,如果大小为2且其中一个是假设的狼一个是好人则本次假设成立。

代码如下:

#include<vector>
#include<cmath>
using namespace std;
int main()
{
	int n;
	cin>>n;
	vector<int>v(n+1);
	for(int i=1;i<=n;i++)	cin>>v[i];
	for(int i=1;i<=n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			vector<int>lie,a(n+1,1);
			a[i]=a[j]=-1;
			for(int k=1;k<=n;k++)
				if(v[k]*a[abs(v[k])]<0)	lie.push_back(k);
			if(lie.size()==2&&a[lie[0]]+a[lie[1]]==0)
			{
				cout<<i<<" "<<j;
				return 0;
			}
		}
	}
	cout<<"No Solution";
	return 0;
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读