判断谁说真话,谁说假话

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);
                        }
                    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值