题目是这样的:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
用0来表示不是凶手 1表示是凶手
假设所有人都是0
A=0,B=0,C=0,D=0
只有一个人说假话那就会出现四种情况
(1)A在说谎,根据每个人的供词可得出( A=1 C=1 D=1 D=0) 这里首先就出现了三个凶手的矛盾,而且D是凶手D不是凶手也矛盾,所以可得出A并没有乱讲。
(2)B在说谎,根据每个人的供词得出 (A=0 C=0 D=1 D=0)D是凶手D不是凶手发生矛盾。
(3)C在说谎,根据每个人的供词得出 (A=0 C=1 D=0 D=0)这里只有一个凶手而且还没有矛盾发生,因此可断定C就是凶手。
(4)D在说谎,根据每个人的供词得出 (A=0 C=1 D=1 D=0)这里出现了两个凶手发生矛盾。
所以呢,代码如下:
#include <stdio.h>
#include <windows.h>
int main()
{
int A = 0;
int B = 0;
int C = 0;
int D = 0;
int against = 0 ;//因为C和D说的话刚好对立,表示对立的。
int i = 0;
for (i = 1; i <= 4; i++)
{
if (i == 1)//A说的假话
{
A = 1;
C = 1;
against = 1;
D = 0;
}
if (i == 2)//B说的假话
{
A = 0;
C = 0;
against = 1;
D = 0;
}
if (i == 3)//C说的假话
{
A = 0;
C = 1;
against = 0;
D = 0;
}
if (i == 4)//D的说的假话
{
A = 0;
C = 1;
against = 1;
D = 0;
}
if (A + B + C + D + against == 1 && against == D)//A + B + C + D + against == 1 表示事件不会同时发生,所以会出现一个凶手。
//因为C和D说的话推出的都是D是凶手D不是凶手 &&against == D是为了排除D是D不是的情况
printf("A=%d B=%d C=%d D=%d\n", A, B, C, D);
}
system("pause");
return 0;
}
第二种方法:直接根据题意(对上面的方法进行优化)
#include <stdio.h>
#include <windows.h>
int main()
{
int slayer = 0;
for (slayer = 'a'; slayer<'e'; slayer++)
{
if (3 == (slayer != 'a') + (slayer == 'c') + (slayer == 'd') + (slayer != 'd'))
//3人说真话,1人说假话的逻辑表示
{
printf("凶手是%c\n", slayer);
}
}
system("pause");
return 0;
}
程序运行结果: