今天的题目原题是这样的:
“
黑与白:
有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。五人对坐,每人都可以看到其它人额头上的纸的颜色。五人相互观察后,
A说:“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸。”
B说:“我看见其它四人额头上帖的都是黑纸。”
C说:“我看见一人额头上帖的是白纸,其它三人额头上帖的是黑纸。”
D说:“我看见四人额头上帖的都是白纸。”
E什么也没说。
现在已知额头上帖黑纸的人说的都是谎话,额头帖白纸的人说的都是实话。问这五人谁的额头是帖白纸,谁的额头是帖黑纸?
“
这个问题跟上一篇的“谁说谎”原理是一样的。
“无论谁都有 黑 跟 白 两种可能”
那我们就能确定有 5 个for进行循环嵌套
for(var A = 0 ;A<=1;A++)
{
for(var B = 0 ;B<=1;B++)
{
for(var C = 0 ;C<=1;C++)
{
for(var D = 0 ;D<=1;D++)
{
for(var E = 0 ;E<=1;E++)
{ //逻辑判断的代码在这里
}
}
}
}
}
接下来我们一句一句的分析:
A说:“我看见有三人额头上帖的是白纸,一人额头上帖的是黑纸。”
那么,A 是白纸的话 有 A==(B+C+D+E==3)==true 如果 A 是黑纸 ,
那 A==(B+C+D+E==3) 依然成立,只是 此时为 A==(B+C+D+E==3)== false 而已 ,所以 我们写 A==(B+C+D+E==3)
B说:“我看见其它四人额头上帖的都是黑纸。”
意思是 B 等于1 的话 B==(A+C+D+E ==0)==true B 不等于 1 的时候也都变为 false 所以也可以写成 B==(A+C+D+E ==0) 或者 B==!(A||C||D||E)
C说:“我看见一人额头上帖的是白纸,其它三人额头上帖的是黑纸。”
同 A 的道理 有 A==(B+C+D+E==3)
D说:“我看见四人额头上帖的都是白纸。”
这里可以写成 D==(A+B+C+E==4) 或者 D==(A&&B&&C&&E)
最后得到的代码是这样的:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
for(var A = 0 ;A<=1;A++)
{
for(var B = 0 ;B<=1;B++)
{
for(var C = 0 ;C<=1;C++)
{
for(var D = 0 ;D<=1;D++)
{
for(var E = 0 ;E<=1;E++)
{
if((B==!(A||C||D||E))&&(D==(A&&B&&C&&E))&&(C==(B+A+D+E==1))&&(A==(B+C+D+E==3)))
alert("a:"+A+"b:"+B+"c:"+C+"d:"+D+"e:"+E);
}
}
}
}
} </script>
结果 是 : C和E 是白纸,其它的是黑纸
ps:现在越想越觉得自己是有多蠢啊,明明很简单却花了挺长的时间来做,都有点想放弃做程序员的念头了