狼人杀-简单版

一开始拿到这个题目,没有什么思路,直接看大佬的做题思路,看了几次,没看懂。
对于没有见过的题目,缺乏一些创新式思维,过于依赖已做过的题。
言归正传:
题目:狼人杀
感觉:此题需要试探,需要列举,第一反应是,过于生活化,导致没有办法立即将其转为程序性思维
从解法上学到的:
1、vector用法:
(1) vector a(10); //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的 数据 类型),但没有给出初值,其值是不确定的。
(2)vector a(10,1); //定义了10个整型元素的向量,且给出每个元素的初值为1
(3)vector a(b); //用b向量来创建a向量,整体复制性赋值
(4)vector a(b.begin(),b.begin+3); //定义了a值为b中第0个到第2个(共3个)元素
(5)int b[7]={1,2,3,4,5,9,8};
vector a(b,b+7); //从数组中获得初值
在本题中用到的是(2)
看题过程中较难理解的地方:
1、if (v[k] * a[abs(v[k])] < 0) lie.push_back (k);、
一直纠结在这判断中,自己动手去模拟一下就可以了。
V[k]是这个人原本说的话,abs(V[k])是这个人所判断的人的真假。
在a[]数组中,已经对该人进行模拟判断,已经有了一个基本判断。
这道题就是在试错,不断尝试。
//若该人身份与刚开始描述不符,就将这个判断者记为lier
2、a[lie[0]] + a[lie[1]] ==0
这一句是用来说,两个说谎者,一个狼人,一个好人
总结:
感觉一些题的小细节可以不必在刚开始就考虑,可以在后面用一个小条件来束缚
经验教训:
当发现代码完全一样,但是有错误时,可以检查括号符号

代码:

#include<bits/stdc++.h>
//多多使用vector 
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);   //将其n+1个的初值都设为1,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 <<endl;
		return 0; 	//能实现有多个解,输出最小解(顺序) 
		} 
	}  	
} 
    cout << "No Solution" <<endl; 
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值