问题
黑与白:有A,B,C,D,E五个人每人额头上都贴着一张纸牌:要么为黑色,要么为白色。
- 每个人都能看到别人的颜色但是看不到自己的颜色。五人相互观察后
- A说:我看到三人为白,一人为黑。
- B说:我看到四人全黑。
- C说:我看到三人为黑,一人为白。
- D说:我看到四人全白。
- E说:我不发表任何意见。现在已知:贴黑牌的说的都是谎话,白牌的人说的是实话。
- 请问他们各自都是什么颜色的牌。
分析
每个人头上的牌有两种颜色,而且这两种颜色跟该人是否说谎是一一对应的。所以用穷据的方法就可以找出每个人头上牌的颜色。
程序
1: /** 2: * @file 052c.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Thu Jul 11 14:16:49 2013 5: * 6: * @brief 黑与白:有A,B,C,D,E五个人每人额头上都贴着一张纸牌:要么为黑色,要么为白色。 7: * 每个人都能看到别人的颜色但是看不到自己的颜色。五人相互观察后 8: * A说:我看到三人为白,一人为黑。 9: * B说:我看到四人全黑。 10: * C说:我看到三人为黑,一人为白。 11: * D说:我看到四人全白。 12: * E说:我不发表任何意见。现在已知:贴黑牌的说的都是谎话,白牌的人说的是实话。 13: * 请问他们各自都是什么颜色的牌。 14: */ 15: 16: #include <stdio.h> 17: 18: #define N 2 19: int main(int argc, char *argv[]) 20: { 21: int a,b,c,d,e; 22: 23: for (a=0; a < N; ++a){ 24: for (b=0; b < N; ++b){ 25: for (c=0; c < N; ++c){ 26: for (d=0; d < N; ++d){ 27: for (e=0; e < N; ++e){ 28: if ( ( ( !a && ( b+c+d+e==1 ) ) || ( a&& ( b+c+d+e !=1 ) ) ) && 29: ( ( !b && ( a+c+d+e==4 ) ) || ( b&& ( a+c+d+e !=4 ) ) ) && 30: ( ( !c && ( a+b+d+e==3 ) ) || ( c&& ( a+b+d+e !=3 ) ) ) && 31: ( ( !d && ( a+b+c+e==0 ) ) || ( d&& ( a+b+c+e !=0 ) ) )){ 32: printf ("A is wearing %s ", a?"black":"white"); 33: printf ("B is wearing %s ", b?"black":"white"); 34: printf ("C is wearing %s ", c?"black":"white"); 35: printf ("D is wearing %s ", d?"black":"white"); 36: printf ("E is wearing %s ", e?"black":"white"); 37: } 38: } 39: } 40: } 41: } 42: } 43: return 0; 44: }
结果
A is wearing black B is wearing black C is wearing white D is wearing black E is wearing white