Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12620
  • 博文数量: 3
  • 博客积分: 221
  • 博客等级: 二等列兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-18 13:45
个人简介

文章分类

全部博文(3)

文章存档

2013年(1)

2010年(2)

我的朋友
最近访客

分类: PHP

2013-01-15 20:42:53

同事在MOMO上转了一个问题,问题是这样的
某仓库失窃,四个保管员涉嫌被传讯。四人的口供如下:
甲:我们四人都没作案。
乙:我们中有人作案。
丙:乙和丁至少有人没作案。
丁:我没作案。
如果四人中有两人说的是真话,有两人说的是假话,那么说真话的是哪两个?
简单的逻辑推理就能知晓答案,或者Google一下。。。但是我要是问嫌疑犯有几种可能?就不好解了吧。。

下面让我们来分析一下解题思路,甲乙丙丁4个人中每个人都有可能犯罪,可以是单个人也可以是多个人,我们用一个4位的二进制来表示,每一个二进制位上的0表示清白,1表示犯罪,二进制位顺序依次代表甲乙丙丁。如“0101”表示甲丙是清白的,乙丁是罪犯。我们用变量x来表示这个4位的二进制的值。

甲说:我们四人都没作案。就可以表示为:
a = (x == 0000)

a如果等于true表示甲说真话,a如果等于false表示甲说假话。

依次可以把乙、丙、丁说的话表达为如下语句:
b = (x > 0000)
c = (x & 0101 == 0001或0100或0000)
d = (x & 0001 == 0000)

两人说的是真话,有两人说的是假话,也就是说我们下面的表达式必须为真:
a + b + c + d == 2

满足这些条件的x就是可能的疑犯。。。
下面提供php源代码:
for($x = 0; $x < 16; $x++) {
    $a = $x == 0;
    $b = $x > 0;
    $c = in_array($x & 5, array(0, 1, 4));
    $d = ($x & 1) == 0;

    $r = $a + $b + $c + $d;

    if($r == 2) {
        printf('谁说真话?甲:%1$d 乙:%2$d 丙:%3$d 丁:%4$d', $a, $b, $c, $d);
        echo "\n";
        printf('谁是罪犯?甲:%1$d 乙:%2$d 丙:%3$d 丁:%4$d', (bool)($x & 8), (bool)($x & 4), (bool)($x & 2), (bool)($x & 1));
        echo "\n\n";
    }
} 

阅读(1707) | 评论(0) | 转发(0) |
0

上一篇:安裝django遇到的問題

下一篇:没有了

给主人留下些什么吧!~~