C语言黑与白问题
问题描述:
有A、B、C、D、E这5个人,每个人额头上都帖了一张黑或白的纸。5人对坐,每 个人都可以看到其他人额头上纸的颜色。5人相互观察后:
- A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑纸。”
- B说:“我看见其他4人额头上贴的都是黑纸。”
- C说:“我看见1人额头上贴的是白纸,其他3人额头上贴的是黑纸 。”
- D说:“我看见4人额头上贴的都是白纸。”
- E什么也没说。
现在己知额头上贴黑纸的人说的都是谎话,额头贴白纸的人说的都是实话。问这5人 谁的额头上贴的是白纸,谁的额头上贴的是黑纸?
问题分析:
呃呃,刚开始推出来了正确答案,被学弟问的不会用代码写了...
分析每个人说的话,对于每个人来说只有两种情况,说谎或者说的是真话,把所有情况暴力枚举,选出来合适的答案即可
求解逻辑推理类问题的关键就是写出正确的逻辑表达式。将问题分析中列出的限定条件用程序语言描述清楚后就可以使用穷举法来获得最终的判断结果。
用 0 表示贴的是黑纸,1 表示贴的是白纸
判断条件:
1 (a && (b+c+d+e==3) || !a && (b+c+d+e!=3)) && 2 (b && (a+c+d+e==0) || !b && (a+c+d+e!=0)) && 3 (c && (a+b+d+e==1) || !c && (a+b+d+e!=1)) && 4 (d && (a+b+c+e==4) || !d && (a+b+c+e!=4))
代码:
1 #include<stdio.h> 2 int main() 3 { 4 int a, b, c, d, e; /*0表示黑色,1表示白色*/ 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)) && 11 (b && (a+c+d+e==0) || !b && (a+c+d+e!=0)) && 12 (c && (a+b+d+e==1) || !c && (a+b+d+e!=1)) && 13 (d && (a+b+c+e==4) || !d && (a+b+c+e!=4)) 14 ) 15 { 16 printf("A额头上的贴纸是%s色的.\n",a?"白":"黑"); 17 printf("B额头上的贴纸是%s色的.\n",b?"白":"黑"); 18 printf("C额头上的贴纸是%s色的.\n",c?"白":"黑"); 19 printf("D额头上的贴纸是%s色的.\n",d?"白":"黑"); 20 printf("E额头上的贴纸是%s色的.\n",e?"白":"黑"); 21 } 22 return 0; 23 }