问题描述
巴斯维克命案抓住了六个嫌疑犯,他们的口供如下:
A:我不是罪犯
B:A、C中有一个是罪犯
C:A和B说了假话
D:C和F说了假话
E:其他五个人中,只有A和D说了真话
F:我是罪犯
他们中只有一半说了真话,凶手只有一个。
本题可能有多种可能性,即正确答案(找到唯一的凶手)可能有多个,但每一个可能的答案(某一个是凶手)都满足上述口供。
请编程找出可能的凶手输出。
样例:(假设唯一的凶手是A或者D或者E,则输出结果为三行,按字母顺序依次输出)
A
D
E
分析:枚举每个人是罪犯,然后判断即可。
#include <cstdio>
const int N = 6;
bool criminal[N];
bool A(){
return criminal[0] == false;
}
bool B(){
return criminal[0] == true || criminal[3] == true;
}
bool C(){
return !A() && !B();
}
bool F(){
return criminal[5] == true;
}
bool D(){
return !C() && !F();
}
bool E(){
return A() && D() && !C() && !B() && !F();
}
int main(int argc, char** argv) {
for(int i = 0; i < N; i++){
criminal[i] = true;
if( A() + B() + C() + D() + E() + F() == N/2) printf("%c\n", i+'A');
criminal[i] = false;
}
return 0;
}