问题:一位法官在审理一起盗窃案时,对涉及的四名嫌疑犯A,B,C,D进行审问。四人分别供述如下:
A:罪犯在B,C,D三人之中
B:我没有作案,是C偷的
C:在A和D之间有一个是罪犯
D:B说的是事实
但经过警方正确的调查,目前能确定的是四人之中只有两个说了真话,并且罪犯只有一人。请确定真正的罪犯。
分析:有四个人(四个循环,嵌套的),每个人有两种情况,即是罪犯或不是(可用数字代替,0代表不是罪犯,1表示是,即确定每层循环的范围是0~1),四人所说的不确定的话构成四个逻辑表达式,并且返回一个布尔值,再用警方确定的话再构成两个表达式(if语句)进行筛选。
#include <stdio.h>
int main(void)
{
int A,B,C,D;//分别表示A,B,C,D是否是罪犯,如果是,其值为1,否则为0
int la,lb,lc,ld;//分别表示A,B,C,D所说的话,真为1,假为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++)
{
la=B||C||D;//A说:嫌疑犯在B,C,D之中
lb=!B&&C;//B说:我没有作案,是C作案
lc=(A+D==1);//C说:A和D之间有一个罪犯
ld=lb;//D说:赞同B所说
if(la+lb+lc+ld==2&&A+B+C+D==1)//A,B,C,D中有两个人说的话是真的并且四人之中只有一个罪犯
{
if(la)
{
printf("A说的话是真的!\n");
}
if(lb)
{
printf("B说的话是真的!\n");
}
if(lc)
{
printf("C所说的话是真的!\n");
}
if(ld)
{
printf("D所说的话是真的!\n");
}
if(A)
{
printf("A是罪犯!\n");
}
else if(B)
{
printf("B是罪犯!\n");
}
else if(C)
{
printf("C是罪犯!\n");
}
else
{
printf("D是罪犯!\n");
}
}
}
}
}
}
return 0;
}