1. 我设置了一个结构体变量存储每个人的指控信息

struct IF{int type = 0;int no;
};

这里我发现了一件事,如果结构体只有有参数的构造函数,那么直接声明该结构体类型的数组是不行的。但是好处是数组知道下标可以直接赋值。

也就是这样组合最好:

不带有参构造函数的结构体+结构体类型数组

带+结构体类型向量

其次我在判断type类型时,根据读到的符号是不是'-'来判断,但是忘记了吸收空格,所以读到的全部都是空格,后面的no出现了不希望看到的负值,这是调试过程中才发现。

2. 整体思路是,已知有1个平民和1个狼人撒谎,那么进行双循环,共n(n-1)中可能,对于每种可能,在内部走一遍游戏的流程,如果出现冲突,也就是一个人既被判断成狼人,又被判断成平民,说明这种可能不成立,此外,还根据狼人数目。值得注意的是,不是每个人都会被判断出结果,也就是狼人数目为1时,当前情况依然可能成立。

以下是我判断出成立的条件

if(cl&&(wolfnum==2||mannum==n-2)&&(hash[i]!=1||hash[j]!=1))

2.1. 不能产生冲突

2.2. 狼人数量为2,或平民数量为总人数-2

2.3. 两个说谎的人中至少有一个是狼人

很遗憾,最后测试用例都通过的情况下,提交结果发现还是2分。

3. 于是转变思路,不再把前置条件设成哪两个人说谎,而是设成哪两个人是狼人,这样做首先就有一个好处是,首先得到结果一定是最小的序列,不需要再往下。

而且检测是否成立的方式是记录说慌的狼和人的总数,说谎的狼人的总数,一趟下来,看前者==2+后者==1是否都成立。如果是,直接按顺序输出外层和内层循环号,返回0。

AC代码

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<queue>
#include<string>
#include<map>
#include<vector>
#include<set>using namespace std;const int maxn = 110;struct IF{int type = 0;int no;
};IF info[maxn];int main(){int n;scanf("%d",&n);int type,no;char c;for(int i=1;i<=n;i++){getchar();scanf("%c%d",&c,&no);if(c=='-')type = -1;else type = 1;info[i].no = no;info[i].type = type;}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){int liarN = 0;//撒谎的人和狼的总数量int liarwolfN = 0;//撒谎的狼人的数量//i和j是狼人 for(int k=1;k<=n;k++){//走一遍流程,看是否出现冲突 if(info[k].no==i||info[k].no==j){if(info[k].type==1){liarN ++;if(k==i||k==j)liarwolfN ++;}  }else{if(info[k].type==-1){liarN ++;if(k==i||k==j)liarwolfN ++;}} }if(liarN==2&&liarwolfN==1){printf("%d %d",i,j);return 0;}}}printf("No Solution\n");return 0;
}

又做了一次,这次改成了判断撒谎的狼人数==1和撒谎的平民数==1是否同时成立。代码更简洁了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<map>
#include<algorithm>using namespace std;const int maxn = 110;int n,A[maxn];vector<pair<int,int> > ans; bool cmp(pair<int,int> a,pair<int,int> b){return a.first!=b.first?a.first<b.first:a.second<b.second;
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>A[i];}for(int i=1;i<n;i++){for(int j=i+1;j<=n;j++){int lieWolf = 0;int lieMan = 0;for(int k=1;k<=n;k++){if(A[k]<0&&-A[k]!=i&&-A[k]!=j){if(k==i||k==j)lieWolf ++;else lieMan ++;}if(A[k]>0&&(A[k]==i||A[k]==j)){if(k==i||k==j)lieWolf ++;else lieMan ++;}}if(lieWolf==1&&lieMan==1)ans.push_back(make_pair(i,j));}}//    cout<<ans.size()<<endl;if(ans.size()==0){printf("No Solution\n");return 0;}else if(ans.size()==1){printf("%d %d\n",ans[0].first,ans[0].second);return 0;}else{sort(ans.begin(),ans.end(),cmp);printf("%d %d\n",ans[0].first,ans[0].second);}return 0;
}

PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version相关推荐

  1. 记PAT 甲级 2021年 秋季考试 经验总结、线上考试细节、考场题解

    1.简单回顾 今天下午考完了秋季的考试,最终得了97分,第一题扣了3分,非常遗憾.还有一个多小时的时候就已经97了,回来和第一题的剩余3分周旋到最后,没能发现问题所在,不停考虑各种,我觉得可能是陷在已 ...

  2. 【PAT甲级题解记录】1148 Werewolf - Simple Version (20 分)

    [PAT甲级题解记录]1148 Werewolf - Simple Version (20 分) 前言 Problem:1148 Werewolf - Simple Version (20 分) Ta ...

  3. 【PAT】2020年秋季考试划水准备贴

    1.环境 1.时间 PAT一年有三次考试,春季(2-3),秋季(8-9)和冬季(11-12) 本次考试时间: 2020/09/05 13:30:00 2.地点 PAT在非浙江地区(比如上海),往往都只 ...

  4. PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version (20 分)

    7-1 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned in ...

  5. PAT甲级 -- 1148 Werewolf - Simple Version (20 分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  6. PAT 1148 Werewolf – Simple Version – 甲级

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  7. 爆刷PAT(甲级)——之【1148】 Werewolf - Simple Version(20 分)——思维

    之前考的时候想不到.今日抽空解决一下. 题意:N个人各指认一个人是好人还是坏人.其中有两个坏人,剩下的都是好人.而且必然是一个好人和一个坏人说的是谎话.给出他们互相指认的信息,请判断出哪两个是坏人.如 ...

  8. 1148 Werewolf - Simple Version 甲级

    题意: 有n个玩家,有两个狼人,有两人说慌(其中一个为狼人一个为非狼人),找出狼人是谁? 题解: 暴力枚举 先枚举i和j为狼人,然后从1号开始假设其说谎,然后判断是否符合题目要求 代码: #inclu ...

  9. 【PAT】A1148 Werewolf - Simple Version

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

最新文章

  1. 力挺Python!同是程序员,为啥同事年前就实现了财务自由?
  2. 绝对布局优势_遇上狭长型卫生间基本没救?2种布局教会你,什么叫美观实用兼具...
  3. HDU1671-Phone List (trie树)
  4. python模拟登录页面下载_Python爬虫实战入门四:使用Cookie模拟登录——获取电子书下载链接...
  5. python统计文件大小_python工具--01.统计当前目录下的文件的大小
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的停车场管理系统
  7. 同一个按钮绑定多个事件_带你走进JavaScript世界系列——事件处理程序之 IE 事件处理...
  8. linux安装酷q机器人,docker一键安装酷Q搭建个人QQ机器人
  9. 基于vue+html的Web网页音乐播放器设计
  10. 固话月租费有望全免 包月套餐将逐步取代座机费
  11. [Python]_[初级]_[使用PyCharm时不识别根包位置和Debug时报ModuleNotFoundError错误]
  12. Calendar类-日历类常用方法(JAVA)
  13. win11右键,默认就是显示更多怎么调整 右键 默认右键 右 右
  14. 小程序绑定手机,发送验证码
  15. 【k8s】重启kubelet、查看所有服务
  16. MaxEnt分析流程和推荐的分析内容
  17. 杜教筛时间复杂度证明
  18. 推荐几个奇葩的技术公众号
  19. java程序设计实用教程第4版_Java程序设计实用教程(第4版)
  20. 剑指offer编程题(JAVA实现)——第38题:二叉树的深度

热门文章

  1. php ile_get_contents无法请求https连接的解决方法
  2. BZOJ1315 : Ural1557Network Attack
  3. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
  4. Windows server 2003 IP路由配置
  5. js添加网页水印和three.js场景中加水印
  6. 多重影分身:一套代码如何生成多个小程序?
  7. Could not apply the stored configuration for monitors 解决办法
  8. redis之 centos 6.7 下安装 redis-3.2.5
  9. 全球物联网产业规模不断扩大 中国市场前景分析
  10. 【智能家居篇】wifi网络结构(上)