有兴趣的玩一下:谁是凶手。写个程序来解答。

字体: | 打印

某地发生了一起谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯中的一个。以下为4个嫌疑犯的供词。
    A说:不是我。
    B说:是C。
    C说:是D。
    D说:C在胡说。
已知3个人说了真话,1个人说的是假话。请根据这些信息,写一个程序来确定到底谁是凶手。

看看大家的基本功。

我也来说两句 查看全部评论 相关评论

  • Eric.Si.Teng (2008-7-23 09:52:03)

    蛮经典的一道题
  • sentrychen (2008-7-23 10:28:54)



    [ 本帖最后由 sentrychen 于 2008-7-23 10:30 编辑 ]
  • Eric.Si.Teng (2008-7-23 10:38:23)

    QUOTE:

    原帖由 sentrychen 于 2008-7-23 10:28 发表

    $men['a'] = false;
    $men['b'] = false;
    $men['c'] = false;
    $men['d'] = false;
    foreach ($men as $man=>$iskiller)
    {
        $men[$man] = true;
        if (3 == (int)!$men['a'] + (int) $men['c'] +  (int)  ...
    思路是对的,不错。
    不过写的不够简洁,也不够直观。
  • CrossMaya (2008-7-23 11:17:12)

    错了 。。在改

    [ 本帖最后由 CrossMaya 于 2008-7-23 11:20 编辑 ]
  • roger (2008-7-23 11:28:22)



    [ 本帖最后由 roger 于 2008-7-23 11:30 编辑 ]
  • londit.cn (2008-7-23 11:36:45)

    楼上的不赖啊
  • xueren (2008-7-23 11:37:53)

    C和D肯定有一个人在说假话,既然有3个人在说真话,那肯定有一个人在说假话,那必是C和D中的,那B说的肯定是真话,那就是C是坏蛋喽!  对吗?
  • Eric.Si.Teng (2008-7-23 11:45:46)

    QUOTE:

    原帖由 roger 于 2008-7-23 11:28 发表

    function findKiller($note){
        foreach($note as $men=>$says){
            $num = countTF($men, $note);
            if($num['t']==3 && $num['f']==1){
                return $men;
            }
        }
    }
    funct ...
    比第一个朋友写的还复杂。。。
  • Sunyanzi (2008-7-23 11:58:48)



    最简单的写法 ...
  • Eric.Si.Teng (2008-7-23 12:09:14)

    QUOTE:

    原帖由 Sunyanzi 于 2008-7-23 11:58 发表


    最简单的写法 ...
    每个月啥也不干,月底向老板伸一下手讨要工资,这是不是最好的工作?
    你能找到这样的工作吗?别忘了把我介绍进去啊。
  • willko (2008-7-23 12:41:17)



    [ 本帖最后由 willko 于 2008-7-23 16:40 编辑 ]
  • Sunyanzi (2008-7-23 12:43:44)

    QUOTE:

    原帖由 Eric.Si.Teng 于 2008-7-23 12:09 发表

    每个月啥也不干,月底向老板伸一下手讨要工资,这是不是最好的工作?
    你能找到这样的工作吗?别忘了把我介绍进去啊。
    好啦我开玩笑的 ...

    我的写法是这样的 ...   




    为了“简洁直观”没做数组的 false fill ...

    并且使用了 unset 替代归零 ...

    所以出现 Notice 错误是正常现象 ...
  • willko (2008-7-23 12:45:26)

    如果是凶手简化的问题
    A说:不是我。 ( ==a说:是我。)
    B说:是C。( ==b说:不是c。)
    C说:是D。(==c说:不是d)
    D说:C在胡说。(==d说 是d)
  • Eric.Si.Teng (2008-7-23 12:51:46)

    QUOTE:

    原帖由 Sunyanzi 于 2008-7-23 12:43 发表


    好啦我开玩笑的 ...

    我的写法是这样的 ...   




    为了“简洁直观”没做数组的 false fill ...

    并且使用了 unset 替代归零 ...

    所以出现 Notice 错误是正常现象 ...
    写得再简洁些
  • Sunyanzi (2008-7-23 13:03:46)

    QUOTE:

    原帖由 Eric.Si.Teng 于 2008-7-23 12:51 发表
    写得再简洁些
    参见我 10# 的回复吧 ...

    C  和 D 的发言互斥 ... 于是可以简化成 ...



    $condition 此时的期待值是 3 ..

    于是可以简化成 ...



    语言描述之为 不是 A 而是 C ...

    于是得出唯一解 C ... 于是就是我 #10 的回复了 ...

    你还想怎么简化 ..?



    写成这样 ...?
  • sara (2008-7-23 13:17:16)

    我比较喜欢roger的写法,通用。
  • Eric.Si.Teng (2008-7-23 13:58:12)

    好了,不玩了。
  • Sunyanzi (2008-7-23 13:59:57)

    啊 ... 果然是更简单的写法 ...
  • karas9 (2008-7-23 14:07:53)

    受教
  • phpcaicai (2008-7-23 14:53:01)

    不错