52.黑与白 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。五人对坐,每人都可以看到其它人额头上的纸的颜色。五人相互观察后, 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&.&.a 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 穷举每个人额头所帖纸的颜色的所有可能的情况,代入上述表达式中进行推理运算,使上述表达式为“真”的情况就是正确的结果。 *程序与程序注释 #include void main() { int a,b,c,d,e. for(a=0.a<=1.a ) /*黑色:0 白色:1*/ for(b=0.b<=1.b ) /*穷举五个人额头帖纸的全部可能*/ for(c=0.c<=1.c ) for(d=0.d<=1.d ) for(e=0.e<=1.e ) if((a&.&.b c d e==3||!a&.&.b c d e!=3) &.&.(b&.&.a c d e==0||!b&.&.a 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)) { printf("A is pasted a piece of %s paper on his forehead.\n", a?"white":"black"). printf("B is pasted a piece of %s paper on his forehead.\n", b?"white":"black").