c语言的问题(黑与白)

来源:百度知道 编辑:UC知道 时间:2024/05/22 19:31:19
/*有A,B,C,D,E,五人,每人额头上都帖着一张或黑或白的纸。五人对坐,每人都能看见别人的,但看不见自己的。而且黑的撒谎,白的诚实。
A说:“我看见有三个人的是白纸,一人是黑纸”。
B说:“我看见四个人的都是黑纸”。
C说:“我看见有一个人的是白纸,三个人是黑纸”。
D说:“我看见四个人的都是白纸”。
E什么也没有说。*/
#include <stdio.h>
main()
{
int a,b,c,d,e;
for(a=0;a<=1;a++)
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");

printf("C is pasted a piece of %s paper on his forehead.\n",c?"white":"black");

比如对A: A说:“我看见有三个人的是白纸,一人是黑纸”。
3个人白纸一个黑纸则b+c+d+e应该为3
如果A头上是白纸即a=1 则a&&b+c+d+e==3为真 若是黑纸a=0即!a则
!a&&b+c+d+e!=3为真 不管是白还是黑(a&&b+c+d+e==3||!a&&b+c+d+e!=3)应该为真 每个人对应的都是真值就输出此时各个人头上的纸是黑还是白

运行结果为a b c d e依次为0 0 1 0 1 你检测一下

((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))应该为1的 其他情况下都是0

对=1,错=0;
依次判断:
a对b错则:b=0 且 a&&b+c+d+e==3
或a错b错则:b=0 且 !a&&b+c+d+e!=3;
b对a错则:a=0, 其他全黑 b&&a+c+d+e==0
或b错则:!b&&a+c+d+e!=0;
c对a错则:c&&a+b+d+e==1
或c错则...;
d对则 5个对,d&&a=1,b+c+e=3, 共等于4
或d错则...;
循环所有组合,同时满足上列条件就是结果

首先
当abcde五个数的值符合这个条件的时候
((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))
就是得到正确答案的时候...
程序最上面是5个for循环嵌套,这个不用过多解释吧=。=
最下面的printf系列语句是if成立的情况下执行的。
其中 条件?数据1:数据2 是c的三目运