日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在根据这些信息,写一个程序来确定到底谁是凶手。
首先我们分析一下:4个人 1个说谎。当我们判断出谁在说谎,然后4个条件综合肯定能指向一个人,这个人就是凶手(也是说谎的那个人)
我们用“1”表示他是凶手,第一位表示D,第二位表示C,第三位表示B,第四位表示A。即ABCD
则:A说 不是他 可表示为 “0111” 即 ~8
B说 是C 可表示为 “0010” 即 2
C说 是D 可表示为 “0001” 即 1
D说 C在胡说 可表示为 “~C(1110)”
我们依次假设A(BCD)在说谎
可以得出A在说谎(凶手)
下来我们用C语言来完成找凶手:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int A = ~8;
int B = 2;
int C = 1;
int D = ~C;
if((1==((~A)&B&C&D))||(2==((~A)&B&C&D))||(4==((~A)&B&C&D))||(8==((~A)&B&C&D)))
{
printf("A说谎(凶手)\n");
}
if((1==(A&(~B)&C&D))||(2==(A&(~B)&C&D))||(4==(A&(~B)&C&D))||(8==(A&(~B)&C&D)))
{
printf("B说谎(凶手)\n");
}
if((1==(A&B&(~C)&D))||(2==(A&B&(~C)&D))||(4==(A&B&(~C)&D))||(8==(A&B&(~C)&D)))
{
printf("C说谎(凶手)\n");
}
if((1==(A&B&C&(~D)))||(2==(A&B&C&(~D)))||(4==(A&B&C&(~D)))||(8==(A&B&C&(~D))))
{
printf("D说谎(凶手)\n");
}
return 0;
}