题目描述

明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。

明明所知道的是,他的同学中有 NNN 个人始终说假话,其余的人始终说真。

现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个!

输入格式

输入由若干行组成,第一行有三个整数,M(1≤M≤20)M(1≤M≤20)M(1≤M≤20)、N(1≤N≤M)N(1≤N≤M)N(1≤N≤M)和P(1≤P≤100)P(1≤P≤100)P(1≤P≤100);MM是参加游戏的明明的同学数,NNN是其中始终说谎的人数,PPP是证言的总数。

接下来MMM行,每行是明明的一个同学的名字(英文字母组成,没有空格,全部大写)。

往后有PPP行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过250250250个字符。

输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。

输出格式

如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出 Impossible

输入输出样例

输入 #1 复制
3 1 5
MIKE
CHARLES
KATE
MIKE: I am guilty.
MIKE: Today is Sunday.
CHARLES: MIKE is guilty.
KATE: I am guilty.
KATE: How are you??
输出 #1 复制
MIKE

思路

一看就是一道一顿模拟就才可以了

首先,因为说谎的人有多个,不好枚举;而是罪犯的人只有一个,我们就可以枚举罪犯和他犯案时的时间(星期几)然后判断是否合法

判断合法:

首先,要看这时候每个人是否说过相悖的话,就是两句话不成立,就直接不合法。

然后,有的人啊,既不能判断他说了真话,也不能判断他说了假话,这样不仅可以认为他从头到尾说了假话,也可以认为从头到尾说了真话,所以要特判一下

代码

#include<bits/stdc++.h>
#define maxn 21
#define maxp 101
using namespace std;
int n,m,p,pp;
string name[maxn];
map<string,int> man;
string Day[8]={"",
"Today is Monday.",
"Today is Tuesday.",
"Today is Wednesday.",
"Today is Thursday.",
"Today is Friday.",
"Today is Saturday.",
"Today is Sunday."
};
struct zj{int who;//谁说的 int t;//1:是罪犯,2:不是罪犯,3:星期几 int data;//星期几或第几个人
}e[maxp];
int f[maxn];
bool check(int who,bool x){if(f[who]==-1){f[who]=x;return 1;}else{if(f[who]==x)return 1;else return 0;//与之前的言论不符}
}
bool judge(int who,int day){for(int i=1;i<=n;i++)f[i]=-1;for(int i=1;i<=pp;i++){if(e[i].t==1){if(check(e[i].who,e[i].data==who));//分号就是一个空语句,占位用else return 0;}else if(e[i].t==2){if(check(e[i].who,e[i].data!=who));else return 0;}else if(e[i].t==3){if(check(e[i].who,e[i].data==day));else return 0;}}int sum1=0,sum2=0;for(int i=1;i<=n;i++){if(f[i]==0){sum1++;}else if(f[i]==-1){sum2++;}}return sum1<=m&&m<=sum1+sum2;//之前说的特判
}
int main(){cin>>n>>m>>p;for(int i=1;i<=n;i++){cin>>name[i];man[name[i]]=i;//map数组把人的名字转换成数字}for(int i=1;i<=p;i++){string who,say;cin>>who;who=who.substr(0,who.length()-1);//去掉:getline(cin,say);say=say.substr(1,say.length()-2);//不知道为什么自己这里不用-2而洛谷要-2,可能是洛谷的评测把最后一个换行读进去了吧if(say=="I am guilty.")e[++pp]=(zj){man[who],1,man[who]};else if(say=="I am not guilty.")e[++pp]=(zj){man[who],2,man[who]};else{for(int j=1;j<=7;j++){if(say==Day[j]){e[++pp]=(zj){man[who],3,j};}}for(int j=1;j<=n;j++){if(say==name[j]+" is guilty."){e[++pp]=(zj){man[who],1,j};}else if(say==name[j]+" is not guilty."){e[++pp]=(zj){man[who],2,j};}}}}int ans=-1;for(int i=1;i<=n;i++){for(int j=1;j<=7;j++){if(judge(i,j)){if(ans!=-1){printf("Cannot Determine");return 0;}ans=i;break;//防止一个罪犯可能有多重犯罪的时间,所以可能会误判成有多个罪犯,所以要直接下一个人}}}if(ans!=-1)cout<<name[ans];else printf("Impossible");return 0;
}

如果还不懂的在评论区说一下

不行就私信我

谢谢–zhengjun

洛谷P1039侦探推理题解--zhengjun相关推荐

  1. 洛谷 P1039 侦探推理 题解

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  2. 洛谷P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  3. [NOIP2003] 提高组 洛谷P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  4. 洛谷 P1039 侦探推理

    题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...

  5. 洛谷P1053篝火晚会题解--zhengjun

    题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有nnn个同学,编号从1 ...

  6. 洛谷P1034矩形覆盖题解--zhengjun

    题目描述 在平面上有 nnn 个点(n≤50n \le 50n≤50),每个点用一对整数坐标表示.例如:当 n=4n=4n=4 时,444 个点的坐标分另为:p1p_1p1​(1,11,11,1),p ...

  7. 洛谷P1036选数题解--zhengjun

    题目描述 已知 nnn 个整数 x1,x2,-,xnx_1,x_2,-,x_nx1​,x2​,-,xn​,以及111 个整数 kkk (k<nk<nk<n).从 nnn 个整数中任选 ...

  8. 洛谷P1033自由落体题解--zhengjun

    题目描述 在高为HHH的天花板上有nnn个小球,体积不计,位置分别为 0,1,2,-,n−10,1,2,-,n-10,1,2,-,n−1.在地面上有一个小车(长为LLL,高为KKK,距原点距离为S1S ...

  9. 洛谷P1070道路游戏题解--zhengjun

    题面传送门 思路 首先,这道题一定是个dpdpdp,因为题中说一旦机器人走到头了,就要立刻在其他任意的一个机器人工厂买. 一开始弄得fi,jf_{i,j}fi,j​是到了第iii个工厂,用了jjj个时 ...

最新文章

  1. 微软和谷歌的人工智能,在SuperGLUE基准测试中超越了人类
  2. 索佳电子水准数据传输软件_183家软件服务行业上市公司完整名单及分析
  3. count sort, radix sort, bucket sort
  4. C#图解教程 第六章 深入理解类
  5. python基本符合_python 3-3(2019-11-06 ) Python基础 (三)
  6. 链接数据库增删改通用
  7. java功夫手机游戏6_我功夫贼六手游下载
  8. Redis高可用架构 (redis主从+sentinel)
  9. php fopen html,PHP fopen和fwrite函数实现创建html页面_PHP教程
  10. Raspberry Pi 构建一个飞机观察器
  11. 个人源码管理,SVN本地化
  12. mssql 取数据指定条数(例:100-200条的数据)
  13. 通过Jquery异步获取股票实时数据
  14. 【机器学习系列】隐马尔科夫模型第二讲:前向算法、后向算法
  15. word转pdf公式乱码_word转pdf乱码
  16. 排水沟槽开挖土方的计算方法(平行相似梯形组成的六面体体积分割计算方法)
  17. ThinkPHP门面源码解析
  18. 如何在线免费PDF转换PPT
  19. 全新型号,戴尔(Dell) EMC PowerEdge R760机架式服务器产品特性及详细技术参数
  20. 微信小程序的轮播图宽高

热门文章

  1. WIN10 64位系统MATLAB R2018b第一次安装libsvm
  2. 浅谈ajax使用方法
  3. 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
  4. 软件设计工程——设计流程
  5. ubuntu16.04录制4K屏软件使用备注
  6. 南京中北学院荣跃计算机,南京师范大学中北学院来我院交流调研
  7. 大数据学习笔记:聚类分析
  8. 新手如何使用腾讯云云服务器详细教程
  9. 关于u盘快捷方式病毒的解决方案
  10. Loan Repayment//二分//排位3