问题描述:
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯
的一个。以下为4个嫌疑犯的供词。
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手。
思路一:
手动分析:采用排除法,分别假设ABCD四人中有一人说谎,推测ABCD中的状态,判断是否满足条件
1)假设A说谎:四人状态为 A=1 C=1 D=1 D=0,此状态下D既是凶手既不是凶手,此假设不成立
2)假设B说谎:四人状态为 A=0 C=0 D=1 D=0,此状态下D既是凶手既不是凶手,此假设不成立
3)假设C说谎:四人状态为 A=0 C=1 D=0 D=0,此状态下C是凶手,此假设成立
4)假设D说谎:四人状态为 A=0 C=1 D=1 D=1,此时有两个凶手,不符合题意
代码:
void Killer()
{
int a=0,b=0,c=0,d=0;
int i,fd;
for(i=1;i<=4;i++)
{
if(i==1)
{
//a说假话
a=1;c=1;d=1;d=0;fd=1;//fd表示c和d的话矛盾
}
if(i==2)
{
//b说假话
a=0;c=0;d=1;d=0;fd=1;
}
if(i==3)
{
//c说假话
a=0;c=1;d=0;d=0;fd=0;
}
if(i==4)
{
//d说假话
a=0;c=1;d=1;d=0;fd=1;
}
if(a+b+c+d+fd==1 && fd==d)
printf("a:%d b:%d c:%d d:%d\n",a,b,c,d);
}
}
思路2:
可根据题目所给出的条件可写出逻辑表达式(killer!=’A’)(killer==’C’) (killer==’D’) (killer!=’D’),因为四人当中有一个人说假话,故而这四个表达式相加为3时,可求出凶手
思路:
void killer1()
{
int sum=0;
int killer='A';
for(killer='A';killer<='D';killer++)
{
sum=(killer!='A')+(killer=='C')+(killer=='D')+(killer!='D');
if(sum==3)
{
printf("killer:%c\n",killer);
break;
}
}
}
结果: