5.17打卡
一、问题描述:
警察审问4名窃贼嫌疑犯。现在已知,这4人当中仅有一名是窃贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎。
这4个人给警察的回答如下。
甲说:“乙没有偷,是丁偷的。”
乙说:“我没有偷,是丙偷的。”
丙说:“甲没有偷,是乙偷的。”
丁说:“我没有偷。”
请根据这4个人的回答判断谁是窃贼。
二、设计思路:
该问题的关键是使用C语言中的逻辑表达式将问题分析中得到的4个条件表达出来,逻辑表达式如下:
B+D==1&&B+C==1&&A+B==1 ⑤
条件④表示A、B、C、D中必有一个为1。
在程序中可依次假定甲、乙、丙、丁分别为窃贼,带入5进行测试,满足条件⑤的那个人为窃贼,具体如下:
(1)先假定甲为窃贼,即A=1、B=0、C=0、D=0,带入条件⑤测试是否成立,若成立则不再对乙、丙、丁进行测试。
(2)若不成立,则再假定乙为窃贼,即A=0,B=1,C=0,D=0,带入条件⑤测试是否成立,若成立则可确定乙为窃贼,不再对丙、丁进行测试。
(3)若不成立,再假定丙为窃贼,即A=0,B=0,C=1,D=0,带入条件⑤测试是否成立,若成立则可确定丙为窃贼,不再对丁进行测试。
(4)若不成立,再假定丁为窃贼,即A=0,B=0,C=0,D=1,带入条件⑤测试是否成立,若成立则确定丁为窃贼。
三、程序流程图
四、代码实现
#include<stdio.h>
int main(){
int i,A=1,B=0,C=0,D=0;
for(i=1;i<=4;i++)
if(B+D==1&&B+C==1&&A+B==1)
break;
else{
if(i==1)
{
A=0;B=1;
}
if(i==2)
{
B=0;C=1;
}
if(i==3)
{
C=0;D=1;
}
}
printf("判断结果:\n");
if(i==1)
printf("甲是窃贼\n");
if(i==2)
printf("乙是窃贼\n");
if(i==3)
printf("丙是窃贼\n");
if(i==4)
printf("丁是窃贼\n");
}