Board logo

标题: [思考题]凶手、被害、帮凶、目击者 [打印本页]

作者: CrLf    时间: 2015-6-4 01:02     标题: [思考题]凶手、被害、帮凶、目击者

有对夫妇,生一男一女,四口之家。一天晚上,成员中的一个杀了另一个,剩下两个成员分别是帮凶和目击者。

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

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


这是一道逻辑题,你能用编程语言(不限)求解吗?
感觉比较适合支持结构体或对象的语言
作者: 523066680    时间: 2015-6-4 09:14

本帖最后由 523066680 于 2015-6-4 15:33 编辑

现在医学这么发达,这对夫妇有没有可能是gay ……
作者: 523066680    时间: 2015-6-4 17:39     标题: 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 突然感觉自己好渣
作者: yangfengoo    时间: 2015-6-4 20:07

回复 3# 523066680


    对能理解递归这种高大上的表示佩服
作者: 523066680    时间: 2015-6-4 20:34

回复 4# yangfengoo


      人家用N层for的看起来爽快一点,
用递归是因为以前写了排列用的函数模板,拿出来用了
作者: Bella    时间: 2015-6-5 11:45

本帖最后由 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"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2