训练趣题:黑与白 有A、B、C、D、E五人,每人额头上都帖了一张黑或白的纸。(此处用javascript实现)

今天的题目原题是这样的:

黑与白:
有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:现在越想越觉得自己是有多蠢啊,明明很简单却花了挺长的时间来做,都有点想放弃做程序员的念头了

原文地址:https://www.cnblogs.com/mengtree/p/5259784.html