A,B,C,D,E共5个人围成一圈,每人头上戴了一顶帽子,帽子可能是黑色或白色。戴白帽子的人说真话,戴黑帽子的人说假话。
A说:我看到3个人戴白帽子,1个人戴黑帽子;
B说:我看到4个人戴黑帽子;
C说:我看到1个人戴白帽子,3个人戴黑帽子;
D说:我看到4个人戴白帽子。
E什么话都没说。
编程计算出这5个人谁戴白帽子、谁戴黑帽子。
【思路】
戴白帽子算做1(真),戴黑帽子算做0(假)。
那么,如果A戴白帽子,就是B+C+D+E==3;如果A戴黑帽子,就是B+C+D+E!=3。
因此可以得到:((A&&((B+C+D+E)==3)) || (!A&&((B+C+D+E)!=3)))。
同理对B、C、D的说法可以建立计算公式。
最后,遍历A、B、C、D、E的每一种戴帽的可能,把符合计算公式的那些组合值显示出来就可以了。
void findout(void){int a=0, b=0, c=0, d=0, e=0;for(a=0; a<2; a++)for(b=0; b<2; b++)for(c=0; c<2; c++)for(d=0; d<2; d++)for(e=0; e<2; e++){if((((a==1)&&(b+c+d+e==3)) || ((a==0)&&(b+c+d+e!=3)))&&(((b==1)&&(a+c+d+e==0)) || ((b==0)&&(a+c+d+e!=0)))&&(((c==1)&&(a+b+d+e==1)) || ((c==0)&&(a+b+d+e!=1)))&&(((d==1)&&(a+b+c+e==4)) || ((d==0)&&(a+b+c+e!=4)))){printf("a=%d, b=%d, c=%d, d=%d, e=%d\n", a, b, c, d, e);}}}