日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4 个嫌疑人中的一个。一下为4个嫌疑犯的供词
A说:不是我
B说:是C
C说:是D
D说:C在说胡话
已知四个人中有有三个人说了真话,一个人说了假话,请问谁是杀人者?
要解决这类问题,必须先假设谁是杀人者,以下分四种情况讨论
1.若A是杀人者,则A说的是假话,B说的是假话,C说的是假话,D说的是真话,不满足3 真1假 NO
2.若B是杀人者,则A说的是真话,B说的是假话,C说的是假话,D说的是真话,不满足3真1假 NO
3.若C是杀人者,则A说的是真话,B说的是真话,C说的是假话,D说的是真话,满足3真1假 YES
4.若D是杀人者,则A说的是真话,B说的是假话,C说的是真话,D说的是假话,不满足3 真1假 NO
知杀人者是C
在用C语言实现时要控制循环的次数,当执行一次循环时就判断一次结果,在最后用一个计数器记录说真话的人数,如果等于3说明该人是杀人凶手。
代码实现
#include<stdio.h>
#include<stdlib.h>
int main()
{
char killer;
int a=0;
int b=0;
int c=0;
int d=0;
int count=0;
for(killer='A';killer<='D';killer++)
{
a=(killer!='A');
b=(killer=='C');
c=(killer=='D');
d=(killer!='D');
count=a+b+c+d; //记录说真话人的个数
if(count == 3)
{
printf("杀人的是:%c\n",killer);break;
}
}
system("pause");
return 0;
}
#include<stdlib.h>
int main()
{
char killer;
int a=0;
int b=0;
int c=0;
int d=0;
int count=0;
for(killer='A';killer<='D';killer++)
{
a=(killer!='A');
b=(killer=='C');
c=(killer=='D');
d=(killer!='D');
count=a+b+c+d; //记录说真话人的个数
if(count == 3)
{
printf("杀人的是:%c\n",killer);break;
}
}
system("pause");
return 0;
}