ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PAT 1148 Werewolf – Simple Version – 甲级

2020-02-21 14:36:25  阅读:290  来源: 互联网

标签:status PAT Werewolf Simple 狼人 int say vector 数组


题目不再赘述,思路写在代码注释中了,借鉴了柳神的代码,但思路不是很好懂,因此添加了个人的理解
.

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n;
	cin >> n;
	vector<int> say(n  + 1);
	for(int i = 1; i <= n; i++)
		scanf("%d",&say[i]);		//第i个人的说话

	/*总体思想就是用双层for循环两两判定,因为只有两个狼人,就借助设定两个狼人身份来进行双层循环寻找*/
	for(int i = 1; i <= n; i++)
	{
		for(int j = i + 1; j <= n; j++)
		{
			vector<int> lie;	//lie为最终的撒谎成员数组
			vector<int> status(n + 1,1);  // status为身份数组初始为 1(好人) -1(狼人) 
			
			status[i] = status[j] = -1;		//设定第i 和 j 两个人为狼人,身份改为-1
			
			
			/*下面的for循环为核心内容,在设定了第 i  j 两人为狼人的情况下重新遍历say数组和status数组
			如果在遍历结束时刚好抓住两个说谎的*/ 
			for(int t = 1; t <= n; t++)
				if(say[t] * status[abs(say[t])] < 0)	//t说谎了,编号入lie
					lie.push_back(t);

		
			if(lie.size() == 2 && status[lie[0]] + status[lie[1]] == 0)	
			{
				cout<<i<<" "<<j;//满足条件,说明i 和 j的身份设定正确,由此可以得出两个说谎的人,即一个好人和一个狼人
				return 0;
			}
		}

	}
	cout<<"No Solution";
	return 0;
}
浮沉随浪。 发布了19 篇原创文章 · 获赞 7 · 访问量 1万+ 私信 关注

标签:status,PAT,Werewolf,Simple,狼人,int,say,vector,数组
来源: https://blog.csdn.net/lixc316/article/details/104427237

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有