问题概述:
题目:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
目录
一.思路解析:
1.每个人说的话不是真就是假(1/0),有三个人说真话,即为a+b+c+d=3,等于三的组合有很多种, 我们可以使用for循环生成这些组合。
2.在三真一假的前提下,我们还要将每个人说的条件串联起来,这样就需要假设每个人说的话是真的,C语言中“真”用1表示,将所有人的条件用真假表示,再相加判断是否等于3(不等于是是因为其中一个人是假话)
二.代码实现:
一.三真一假组合生成:
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
for (a = 0; a <= 1; a++)
{
for (b = 0; b <= 1; b++)
{
for (c = 0; c <= 1; c++)
{
for (d = 0; d <= 1; d++)
{
}
}
}
}
二.连接条件(嫌疑犯的话)
if (a + b + c + d == 3)
{
if ((b && c + b && d + c && d == 1) + (c == 0) + (d == 0) + (c == 0) == 3)
{ //a说凶手不是我,则bcd其中一个是凶手,用代码表示就是b && c + b && d + c && d == 1,其他同理
if (a == 0)
{
printf("凶手是a");
}
if (b == 0)
{
printf("凶手是b");
}
if (c == 0)
{
printf("凶手是c");
}
if (d == 0)
{
printf("凶手是d");
}
}
}
三.所有代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int d = 0;
for (a = 0; a <= 1; a++)
{
for (b = 0; b <= 1; b++)
{
for (c = 0; c <= 1; c++)
{
for (d = 0; d <= 1; d++)
{
if (a + b + c + d == 3)
{
if ((b && c + b && d + c && d == 1) + (c == 0) + (d == 0) + (c == 0) == 3)
{
if (a == 0)
{
printf("凶手是a");
}
if (b == 0)
{
printf("凶手是b");
}
if (c == 0)
{
printf("凶手是c");
}
if (d == 0)
{
printf("凶手是d");
}
}
}
}
}
}
}
return 0;
}