找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 17258|回复: 5

[思考题]凶手、被害、帮凶、目击者

[复制链接]
发表于 2015-6-4 01:02:42 | 显示全部楼层 |阅读模式
有对夫妇,生一男一女,四口之家。一天晚上,成员中的一个杀了另一个,剩下两个成员分别是帮凶和目击者。

并已知以下条件
1、帮凶和目击者性别不同
2、最年长者和目击者性别不同
3、最年轻者和被害者性别不同
4、帮凶年纪比被害者大
5、父亲年纪最大
6、最年轻的不是凶手

请问凶手、被害、帮凶、目击者分别是谁?


这是一道逻辑题,你能用编程语言(不限)求解吗?
感觉比较适合支持结构体或对象的语言
发表于 2015-6-4 09:14:35 | 显示全部楼层
本帖最后由 523066680 于 2015-6-4 15:33 编辑

现在医学这么发达,这对夫妇有没有可能是gay ……
发表于 2015-6-4 17:39:45 | 显示全部楼层

Perl

本帖最后由 523066680 于 2015-6-4 20:36 编辑

  1. use utf8;
  2. binmode(STDOUT, ":encoding(gbk)");

  3. my @cup;
  4. my @element;

  5. our %h=(
  6.     "father"   => { "sex"=>"male",   "age"=>100 },
  7.     "mother"   => { "sex"=>"female", "age"=>90  },
  8.     "son"      => { "sex"=>"male",   "age"=>20  },
  9.     "daughter" => { "sex"=>"female", "age"=>20  },
  10. );

  11. @element = keys %h;

  12. &arrange(\@cup, \@element);

  13. sub arrange {
  14.     my ($a, $b) = (shift, shift);
  15.     my (@ar, @br);

  16.     if (scalar(@{$a}) == 4) {
  17.         &check(@{$a});
  18.     }
  19.     for my $i (0..$#{$b}) {
  20.         @ar=(@{$a}, $b->[$i]);
  21.         @br=@{$b}[0..$i-1, $i+1..$#{$b}];
  22.         &arrange(\@ar, \@br);
  23.     }
  24. }

  25. sub check {
  26.     our %h;
  27.     my ($killer, $victim, $helper, $witness) = @_;
  28.     return 0 if ( $h{$helper}{sex} eq $h{$witness}{sex} );  # 1 帮凶和目击者性别不同
  29.     return 0 if ( $h{father}{sex} eq $h{$witness}{sex} );   # 2 最年长者和目击者性别不同
  30.     return 0 if ( $h{$helper}{age} < $h{$victim}{age} );    # 4 帮凶年纪 大于 被害者年纪

  31.     # 3 最年轻者和被害者性别不同
  32.     # 6 最年轻的不是凶手
  33.    
  34.     if ( $h{$victim}{"sex"} eq "female" ) {   #   若被害者是女性
  35.         return 0 if ( $killer eq "son" );     #则最年轻的是男性(儿子)
  36.         $h{son}{age} = 10;                    #假设年龄
  37.         $h{daughter}{age} = 20;               #假设年龄
  38.     } else {                                  #   相反
  39.         return 0 if ( $killer eq "daughter" );
  40.         $h{son}{age} = 20;
  41.         $h{daughter}{age} = 10;
  42.     }

  43.     return 0 if ( $h{$helper}{age} < $h{$victim}{age} );

  44.     print "凶手:$killer 受害者:$victim, 帮凶:$helper, 目击者:$witness\n";
  45.     return 1;
  46. }

复制代码
arrange 是递归排列

凶手:mother 受害者:son, 帮凶:father, 目击者:daughter

在某个群里一问,人家十来秒就把答案手算出来了 T_T 突然感觉自己好渣

评分

参与人数 3技术 +4 收起 理由
CrLf + 2 忘了给分,补上
会飞的蜗牛丶 + 1 比较牛
aa77dd@163.com + 1 1 我不会perl

查看全部评分

发表于 2015-6-4 20:07:36 | 显示全部楼层
回复 3# 523066680


    对能理解递归这种高大上的表示佩服
发表于 2015-6-4 20:34:32 | 显示全部楼层
回复 4# yangfengoo


      人家用N层for的看起来爽快一点,
用递归是因为以前写了排列用的函数模板,拿出来用了
发表于 2015-6-5 11:45:50 | 显示全部楼层
本帖最后由 Bella 于 2015-6-6 15:19 编辑
  1. @echo off
  2. set /a gender[father]=gender[son]=1,gender[mother]=gender[daughter]=0
  3. set /a age[father]=3,age[mother]=2
  4. call :perm " father mother son daughter"
  5. pause&exit

  6. :perm
  7. setlocal enabledelayedexpansion
  8. set "chars=%~1"
  9. if "!chars!" == "" (
  10.     for %%i in (son daughter) do (
  11.         set /a age[son]=age[daughter]=1,age[%%i]=0
  12.         for /f "tokens=1-4" %%a in (%2) do (
  13. if !age[%%c]! GTR !age[%%b]! if !gender[%%c]! NEQ !gender[%%d]! ^
  14. if "%%i" NEQ "%%a" if !gender[%%i]! NEQ !gender[%%b]! if !gender[%%d]! NEQ 1 ^
  15. echo murderer:%%a victim:%%b accomplice:%%c witness:%%d
  16.         )
  17.     )
  18. ) else for %%j in (%~1) do call :perm "!chars: %%j=!" "%~2 %%j"
复制代码

评分

参与人数 2技术 +4 收起 理由
CrLf + 3 忘了给分,补上
aa77dd@163.com + 1 递归算法比循环干净清爽

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 04:49 , Processed in 0.020640 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表