一、问题描述
有A、B、C、D、E五个人,每人额头上都贴了一张黑色或白色的纸条。五人对坐,每人都可以看到其他人额头上的纸的颜色,但都不知道自己额头上的纸的颜色。五人互相观察后,
A说:“我看见有三个人额头上贴的是白纸,一个人额头上贴的是黑纸。”
B说:“我看见其他四个人额头上贴的都是黑纸。”
C说:“我看见有一个人额头上贴的是白纸,其他三个人额头上贴的是黑纸。”
D说:“我看见四个人额头上贴的都是白纸。”
E说:“我不发表观点。”
现在一直额头上贴黑纸的人说的都是谎话,额头上贴白纸的人说的都是实话,问这五个人谁的额头上贴的是白纸,谁的额头上贴的是黑纸。
二、算法思想
需要穷举出每个人额头上所贴纸的颜色,假设0表示黑色,1表示白色。然后按照题意列出A、B、C、D四个人所说的话对应的逻辑表达式,并判断所列条件是否成立,成立则输出所贴的纸张颜色即可。依据题意列出额的逻辑表达式为:
A: (a && b+c+d+e==3) || (!a && b+c+d+e!=3)
B: (b && a+c+d+e==0) || (!b && b+c+d+e!=0)
C: (c && a+b+d+e==1) || (!c && a+b+d+e!=1)
D: (d && a+b+c+e==4) || (!d && a+b+c+e!=4)
具体的操作利用循环解决问题,设置多重循环,依次穷举出五人贴白纸和黑纸的所有可能,再用条件语句进行判断,其条件表达式为(注意各个括号覆盖范围):
((a && b+c+d+e==3) || (!a && b+c+d+e!=3)) && ((b && a+c+d+e==0) || (!b && b+c+d+e!=0)) && ((c && a+b+d+e==1) || (!c && a+b+d+e!=1)) && ((d && a+b+c+e==4) || (!d && a+b+c+e!=4))
三、程序代码
1 #include <stdio.h> 2 3 int main(){ 4 int a, b, c, d, e; 5 for(a=0; a<=1; a++){ 6 for(b=0; b<=1; b++){ 7 for(c=0; c<=1; c++){ 8 for(d=0; d<=1; d++){ 9 for(e=0; e<=1; e++){ 10 if( ((a && b+c+d+e==3) || (!a && b+c+d+e!=3)) && ((b && a+c+d+e==0) || (!b && b+c+d+e!=0)) && ((c && a+b+d+e==1) || (!c && a+b+d+e!=1)) && ((d && a+b+c+e==4) || (!d && a+b+c+e!=4)) ){ 11 printf("0-黑纸\t1-白纸\n\n"); 12 printf(" a是%d\n b是%d\n c是%d\n d是%d\n e是%d\n", a, b, c, d, e); 13 } 14 } 15 } 16 } 17 } 18 } 19 return 0; 20 }
四、运行结果