狼人杀c语言代码,1089 狼人杀-简单版——C/C++实现
题目
1089 狼人杀-简单版 (20 point(s))
以下文字摘自《灵机一动·好玩的数学》:“狼人杀”游戏分为狼人、好人两大阵营。在一局“狼人杀”游戏中,1 号玩家说:“2 号是狼人”,2 号玩家说:“3 号是好人”,3 号玩家说:“4 号是狼人”,4 号玩家说:“5 号是好人”,5 号玩家说:“4 号是好人”。已知这 5 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。扮演狼人角色的是哪两号玩家?
本题是这个问题的升级版:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。要求你找出扮演狼人角色的是哪几号玩家?
输入格式:
输入在第一行中给出一个正整数 N(5≤N≤100)。随后 N 行,第 i 行给出第 i 号玩家说的话(1≤i≤N),即一个玩家编号,用正号表示好人,负号表示狼人。
输出格式:
如果有解,在一行中按递增顺序输出 2 个狼人的编号,其间以空格分隔,行首尾不得有多余空格。如果解不唯一,则输出最小序列解 —— 即对于两个序列 A=a[1],...,a[M] 和 B=b[1],...,b[M],若存在 0≤kNo Solution。
输入样例 1:
5
-2
+3
-4
+5
+4
输出样例 1:
1 4
输入样例 2:
6
+6
+3
+1
-5
-2
+4
输出样例 2(解不唯一):
1 5
输入样例 3:
5
-2
-3
-4
-5
-1
输出样例 3:
No Solution
算法
这道题目很长,刚开始拿到,感觉无从下手,不知道如何分析……后来去看了别人的算法思想,还是不太理解,晚上毕业的博士师姐请吃饭,回来又看了电影《死侍》,刚才认真看了分析,终于看懂了。。。考试碰到类似的题目,一点思路都没有,才要头皮发麻……崩溃!!!
起初读完题目知道题目的意思是这样的:
N个人有两个狼人,有2个说谎者;
2个说谎者中一个是狼人,一个是好人;
但是还是没有具体的思路,后来看懂之后感觉其实也挺简单。思路是这样的:由于不知道谁是狼人,因此可以采用计算思维 ,逐个进行验证,反正不缺算力,这对于习惯公式和推导的非计算机专业的理工科学生有时候真的想不到……
首先将数据存起来,存入vector型数组v(n+1),设定i/j两个变量是狼人,i从1~n(由于很多参考算法采用vector都是从1开始存储的,因此也就从1~n了,从0~n-1也是一样的,只不过1~n比较方便),是外层for循环,j从i+1~n,是内层for循环。循环之前,先申请个vector数组a(N+1,1),也就是n+1个数组元素的值都是1,这里a数组元素的值为1表示是好人,为-1表示是狼人,因此由于我们用i,j表示狼人,还需要将a[i]=a[j]=-1才行。同时还需要申请一个lie的vector,因为要往里面存入说谎者,由于不知道有几个,因此直接用vector就好,不用vector数组。这里显示了vector作为C++中动态数组的好处了,妙呀!!!如果有说谎者就存入lie,利用lie.push_back()就可以。
下面就需要知道如何判断说谎者的条件:
自己说别人是狼人(v[k]<0),然而别人并不是狼人(a[abs(v[k])] == 1)
自己说别人不是狼人(v[k]>0),然而别人就是狼人(a[abs(v[k])] == -1)
即:v[k]*a[abs(v[k])] < 0
只要指定判断说谎者的条件,即两个说谎者且其中一个为狼人(lie.size()==2&&a[lie[0]]+a[lie[1]]==0),满足此条件输出即可。由于遍历的顺序是从1~n,自然会满足最小序列的要求。满足条件输出此时的 i,j(我们之前不是让他俩当狼嘛~~~),如果都不满足,输出 No Solution。
代码
#include #include #include using namespace std;
int main(){
int n;cin>>n;
vectorv(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++){
vectorlie,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<
狼人杀c语言代码,1089 狼人杀-简单版——C/C++实现相关推荐
- 狼人杀c语言,微赛狼人杀正式版C位出道
伴随着烈焰夏日的开始,研发大大们细心修改的微赛狼人杀正式版终于与大家见面了! "秀装扮.盘逻辑"微赛狼人杀正式版本已上线,全新的体验即将开启! BUG和调整 1.修改游戏登录界面背 ...
- 源码免杀--反调试代码,免杀爱好者必备的利剑
源码免杀只处理特征码还是不够的,必须要加入反调试代码,这样才能更持久更耐用.这里就发几个暗夜经常用的反调试代码给大家. 1. HKEY ck; char strreg[] = {'S','O','F' ...
- 七日杀服务器修改武器,七日杀物品修改代码大全 七日杀合成表修改教程及代码...
七日杀游戏中玩家可以通过修改器合成表来无费制作各种物品,下面来分享一下七日杀合成表修改教程及物品代码,给大家一个参考. 七日杀合成表修改教程及物品代码 你还在纠结物品自己怎么合成不了么?你还在为苦苦寻 ...
- 贪吃蛇python语言代码_Python贪吃蛇简单的代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 在自学Python的过程中在网上查询资料时发现了一些好玩的东西,python的游戏库模块,它可以自己弄一个小游戏来玩玩,然后我在网上找了一些游戏的代码,, ...
- aloha算法c语言代码,论文对最简单的反碰撞算法ALOHA算法进行了研究,在识别时间...
论文对最简单的反碰撞算法ALOHA算法进行了研究,在识别时间和重发次数之间作一下折衷,确定如何选择退避时间. 相关句子 1.确定如何选择这三个之一超出了本文的范围. 2.时间有限,精力有限,金钱有限. ...
- C语言:约瑟夫环(简单版)
传说约瑟夫当年活下来就是靠快速计算这个问题. nn 个人围成一圈,编号依次为1,2,3-n.从第一个人开始报数,数到 mm 的人出列,再由下一个人重新从 11 开始报数,数到 mm 的人再出圈.以此类 ...
- PAT Basic Level 1089 狼人杀-简单版 解题思路及AC代码 v0.96
PAT 乙级 1089 狼人杀-简单版 1. 题目简述及在线测试位置 2. 基本思路 3. 完整AC代码 1. 题目简述及在线测试位置 1.1 N个人玩狼人杀,每个人 按从1到N的编号 顺序说明他人的 ...
- 【简便解法】1089 狼人杀-简单版 (20分)_25行代码AC
立志用最少的代码做最高效的表达 PAT乙级最优题解-->传送门 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人 ...
- PAT 1089 狼人杀-简单版(20 分)(代码+测试点分析)
1089 狼人杀-简单版(20 分) 以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家 ...
最新文章
- 计算机基础办公软件应用技能,计算机一级计算机基础及 ms office 应用考些什么...
- 各种媒体在线播放代码
- [BZOJ2796][Poi2012]Fibonacci Representation
- pytorch 损失函数总结
- 网络爬虫(2)-- Java爬虫框架
- ubuntu~快捷键
- 深圳php和java,深圳java技术培训学习(Java和PHP区别)
- 【字节网盘】九款超好看不同页面404源码
- 非华为电脑配对华为手机(RMB+5899¥)
- 如何部署EDI系统?
- 软件工程复习之rup
- linux运行mentohust,Ubuntu下使用MentoHUST代替锐捷认证上网
- 抽象代数笔记-环、域、扩域、伽罗瓦理论
- Qt解决连接https报错
- java中立方根方法,Java Math.cbrt() 方法
- 北航和北理工计算机专业哪个好,北理和北航哪个好?
- Matlab-初级教程-系列1:matlab之入门教学视频-3 数组和矩阵分析3
- spring配置中加载properties文件方法
- 分布式系统中的一致性模型
- Electron学习笔记 4 添加系统功能
热门文章
- 更改微信浏览器页面标题
- Shell while 语法(: 死循环)
- 网络编程原理进阶___TCP/IP(javaee)
- Asp.net 中将文字写入图片中
- 服务器上Web.config文件不能保存,Web.Config – 由于权限不足,无法读取configuration文件...
- python中gzip库用法详解(压缩和解压缩)
- WEB短信平台定制 短信系统构建 路由通道搭建 web版短信后台管理系统 概括简介
- RevitAPI: 如何判断天花板的族类型是否是复合结构
- 微信小程序:小秋工具箱开发总结
- 草根创业者下一个风口:娃娃机