Description
巴斯维克命案抓住了六个嫌疑犯,他们的口供如下:
A:我不是罪犯
B:A、C中有一个是罪犯
C:A和B说了假话
D:C和F说了假话
E:其他五个人中,只有A和D说了真话
F:我是罪犯
他们中只有一半说了真话,凶手只有一个。
本题可能有多种可能性,即正确答案(找到唯一的凶手)可能有多个,但每一个可能的答案(某一个是凶手)都满足上述口供。
请编程找出可能的凶手输出。
样例:(假设唯一的凶手是A或者D或者E,则输出结果为三行,按字母顺序依次输出)
A
D
E
Input
如题所示。
Output
如题所示。
Sample Input 1
参考上文
Sample Output 1
参考上文
个人写法:
我写的不具备参考价值哈!因为写的特别冗杂,我后面抽空会跟进一个更快更短的写法,但是这个代码我依旧发出来,相当于是介绍一个思路而已
通关代码如下:
#include <bits/stdc++.h>
using namespace std;
bool True[10]; //判断说的是真话(true)还是假话(false)
bool Murder[10]; //判断是(true)否(false)是凶手
//以下函数都是判断每个人的话语以及是否是凶手
void AW() {
if (Murder[0] == true) { //A下标为0,以此类推
True[0] = false; //如果A是凶手,则A说谎
}
else True[0] = true;
}
void BW() {
if (Murder[1] == true) { //如果B是凶手,则B说谎
True[1] = false;
}
else if (Murder[0] == true || Murder[2] == true) { //如果B不是凶手,AC中有一个是凶手则说了真话
True[1] = true;
}
else True[1] = false; //不然就直接判断是说谎
}
void CW() {
if (Murder[2] == true) { //以上面的写法类推
True[2] = false;
}
else if (True[0] == false && True[1] == false) {
True[2] = true;
}
else True[2] = false;
}
void DW() {
if (Murder[3] == true) {
True[3] = true;
}
else if (True[2] == false && True[5] == false) {
True[3] = true;
}
else {
True[3] = false;
}
}
void EW() {
if (Murder[4] == true) {
True[4] = true;
}
else if (True[0] == true && True[1] == false && True[2] == false && True[3] == true && True[5] == false) {
True[4] = true;
}
else True[4] = false;
}
void FW() {
if (Murder[5] == true) {
True[5] = true;
}
else True[5] = false;
}
int main() {
char member[] = "ABCDEF";
//cout << menber[1];
for (int i = 0; i < 6; i++) {
int count = 0;
memset(Murder, false, sizeof(Murder)); //默认六个人都不是凶手,往下逐个判断
Murder[i] = true; //从A开始,假设它是凶手,往下判断
AW();
FW();
BW();
CW();
DW();
EW();
for (int j = 0; j < 6; j++) {
if (True[j] == true) count++; //如果说真话的人正好是三个,那符合了条件,此人是凶手
}
if (count == 3) {
cout << member[i] << endl;
}
}
return 0;
}