逻辑表达式——黑纸白纸

一、问题描述

有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 }

四、运行结果

 

posted @ 2017-05-05 18:00  IronLavender  阅读(950)  评论(0编辑  收藏  举报