问题:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯
的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
解法1
分析,四个人三个人说真话,一个人说假话,所以分别假设每个人说假话的情况,并且C,D说话是相互矛盾的,所以要区分开,CD代表对立面
嫌疑犯 | 是否说谎 | 结论 |
---|---|---|
A | 是 | A = 1 C = 1 D = 0 CD = 1 |
B | 是 | A = 0 C = 0 D = 0 CD = 1 |
C | 是 | A = 0 C = 1 D = 0 CD = 0 |
D | 是 | A = 0 C = 1 D = 1 CD = 0 |
根据上面的假设写出代码如下:
MurderT()
{
//0代表不是凶手,1代表是凶手
int A = 0;
int B = 0;
int C = 0;
int D = 0;//均初始化为0
int CD = 0;//CD说话为对立的,因此需要做标记排除
int i = 0;
for (i; i < 4; i++)
{
if (i == 0)//假如A说的是假话
{
A = 1;
C = 1;
D = 0;
CD = 1;
}
else if (i == 1)//假如B说假话
{
A = 0;
C = 0;
D = 0;
CD = 1;
}
else if (i == 2)//假如C说假话
{
A = 0;
C = 1;
D = 0;
CD = 0;
}
else if (i == 3)//假如D说假话
{
A = 0;
C = 1;
D = 1;
CD = 0;
}
if (A + B + C + D + CD == 1 && CD == D)
//A + B + C + D + CD == 1代表满足只有一个人是凶手条件才可以,CD==D用来排除C和D矛盾的条件
{
printf("A=%d B=%d C=%d D=%d\n", A, B, C, D);
}
}
}
结果如下:
解法2
分析:可以直接用字符方式用for循环,根据四人陈述话语逻辑写if条件,让四人都去验证所写的条件,查找出凶手,简单粗暴。
代码如下:
#include<stdio.h>
#include<windows.h>
Murder()//谋杀案
{
char k;//代表凶手
for (k = 'A'; k <= 'D'; k++)//让凶手四人分别去验证if条件,满足条件者就是凶手
{
if (3 == ((k != 'A') + (k == 'C') + (k == 'D') + (k != 'D')))//只有满足三个人说真话,一个假话,他们之和为3这个条件,就能确定此人是凶手
{
printf("凶手是:%c\n", k);
}
}
}
int main()
{
Murder();//谋杀案
system("pause");
return 0;
}
结果: