免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4507 | 回复: 12
打印 上一主题 下一主题

[其他] 。。。。。。。。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-11 18:01 |只看该作者 |倒序浏览
本帖最后由 ArchieYao 于 2017-10-21 15:14 编辑

。。。。。。。。。。。。。。

评分

参与人数 1可用积分 +3 收起 理由
寂寞烈火 + 3 精品文章

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2008-01-12 16:06 |只看该作者
楼主真是强人啊,刚学就...

太惭愧了!呵呵

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2008-01-12 19:59 |只看该作者
強!
佩服~~~

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2008-01-12 22:46 |只看该作者
学习, 送分鼓励~~

论坛徽章:
0
5 [报告]
发表于 2008-01-12 23:48 |只看该作者
谢谢老大

论坛徽章:
0
6 [报告]
发表于 2008-01-13 00:44 |只看该作者
我昨晚刚手动推算这个问题了
今天就看到有人写代码,真是佩服
顶了

论坛徽章:
0
7 [报告]
发表于 2008-01-13 17:08 |只看该作者
我是一个只学了shell皮毛的人……看到这个代码惭愧啊……~!

论坛徽章:
0
8 [报告]
发表于 2008-01-18 13:26 |只看该作者
楼主很强,我也坐了一下那个题,出结果用了14秒多没有楼主的快,贴上来凑热闹。

  1. #!/bin/bash
  2. # x0 country: [0]English    [1]Sweden        [2]Denmark       [3]Norway        [4]German
  3. # x1 color:   [0]red        [1]green         [2]white         [3]yellow        [4]blue
  4. # x2 drink:   [0]tea        [1]coffee        [2]milk          [3]beer          [4]water
  5. # x3 smoke:   [0]pallmall   [1]dunhill       [2]blends        [3]prince        [4]blueMaster
  6. # x4 pet:     [0]dog        [1]bird          [2]cat           [3]horse         [4]fish
  7. #---------------------------------#
  8. # 假设所有条件代码如上.房子的顺序为(1,2,3,4,5)
  9. # 问题分析 ,根据排列组合公式推算 本题的可能性为 (5*4*3*2*1)^5 = 120^5 = 24883200000
  10. # 其中隐含的第六个条件为房子的顺序 我们假设为 1 2 3 4 5 故不参与排列。
  11. # 在n中选出m个出来排列 n*(n-1)*....(n-m+1)
  12. # 在n中选出m个出来组合 n*(n-1)*....(n-m+1)/(1*2*3*....m)
  13. # 如果全部过滤的可能性不大,根据条件逐次过滤。
  14. # Variables and Function definition
  15. country=(english sweden  denmark norway  german  );
  16. color=(  red     green   white   yellow  blue    );
  17. drink=(  tea     coffee  milk    beer    water   );
  18. smoke=(  palmall dunhill blends  prince  bluemaster);
  19. pet=(    dog     bird    cat     horse   fish    );
  20. function arrange {
  21.   echo {0..4},{0..4},{0..4},{0..4},{0..4}|tr ' ' '\n'|sed -e '/.*\([0-9]\).*\1.*/d'
  22. }
  23. function judge {
  24.   for i in $(seq 0 4);do
  25.   if (( ${_TMP[$i]} == $1 ));then
  26.   _N=$i; break 1
  27.   fi
  28.   done
  29. }
  30. function delidding {
  31.   echo '#--------------------------------------------#'
  32.   echo -n -e "house1\thouse2\thouse3\thouse4\thouse5\n\n"
  33.   x7=($(echo ${_TMP0[@]} ${_TMP1[@]} ${_TMP2[@]} ${_TMP3[@]} ${_TMP4[@]}))
  34.   for i in $(seq 0 24);do
  35.      if (( $i \<5 ));then
  36.         A=${x7[$i]};echo -n -e ${country[$A]}"\t"
  37.    elif (( $i \<10 ));then
  38.         (( $i == 5 )) && echo -e "\n"
  39.         A=${x7[$i]};echo -n -e ${color[$A]}"\t"
  40.    elif (( $i \<15 ));then
  41.         (( $i == 10 )) && echo -e "\n"
  42.         A=${x7[$i]};echo -n -e ${drink[$A]}"\t"
  43.    elif (( $i \<20 ));then
  44.         (( $i == 15 )) && echo -e "\n"
  45.         A=${x7[$i]};echo -n -e ${smoke[$A]}"\t"
  46.    elif (( $i \<25 ));then
  47.         (( $i == 20 )) && echo -e "\n"
  48.         A=${x7[$i]};echo -n -e ${pet[$A]}"\t"
  49.      fi
  50.   done
  51.   echo -e "\n"'#--------------------------------------------#'
  52. }
  53. # Program main
  54. for x0 in $(arrange);do
  55. _TMP0=($(echo ${x0}|tr ',' ' '))
  56. (( ${_TMP0[0]} != 3 )) && continue 1 # 威人住第一间房子

  57.   for x1 in $(arrange);do
  58.     _TMP1=($(echo ${x1}|tr ',' ' '))
  59.     _TMP=(${_TMP1[@]})
  60.     (( ${_TMP1[1]} != 4 )) && continue 1 # 挪威人住蓝色房子隔壁
  61.     judge 0;(( ${_TMP0[$_N]} != 0 )) && continue 1 # 英国人住红色房子
  62.     judge 1;_G=$_N;judge 2;_W=_N
  63. #    (( $_G > $_W )) && continue 1 # 绿色房子在白色房子左面,这里有两种不同的理解,绿白是否相邻,如果不相邻用这句。
  64.     (( $_W != $[$_G+1] )) && continue 1 # 绿色房子在白色房子左面 如果相邻用这句,不相邻的结果不唯一,有3种可能,这里假设相邻。

  65.     for x2 in $(arrange);do
  66.       _TMP2=($(echo ${x2}|tr ',' ' '))
  67.       _TMP=(${_TMP2[@]})
  68.       (( ${_TMP2[2]} != 2 )) && continue 1 # 住在中间房子的人喝牛奶
  69.       judge 0;(( ${_TMP0[$_N]} != 2 )) && continue 1 # 丹麦人喝茶
  70.       judge 1;(( ${_TMP1[$_N]} != 1 )) && continue 1 # 绿色房子主人喝咖啡

  71.       for x3 in $(arrange);do
  72.         _TMP3=($(echo ${x3}|tr ',' ' '))
  73.         _TMP=(${_TMP3[@]})
  74.         judge 3;(( ${_TMP0[$_N]} != 4 )) && continue 1 # 德国人抽prince香烟
  75.         judge 1;(( ${_TMP1[$_N]} != 3 )) && continue 1 # 黄色房子主人抽Dunhill
  76.         judge 4;(( ${_TMP2[$_N]} != 3 )) && continue 1 # 抽BlueMaster的人喝啤酒
  77.         judge 2;if (( $_N \< 4 )) && (( ${_TMP2[$[$_N+1]]} == 4 ));then : # 抽Blends香烟人的有一个喝水的邻居
  78.               elif (( $_N \> 0 )) && (( ${_TMP2[$[$_N-1]]} == 4 ));then :
  79.               else continue 1
  80.                 fi

  81.         for x4 in $(arrange);do
  82.           _TMP4=($(echo ${x4}|tr ',' ' '))
  83.           _TMP=(${_TMP4[@]})
  84.           judge 0;(( ${_TMP0[$_N]} != 1 )) && continue 1 # 瑞典人养狗
  85.           judge 1;(( ${_TMP3[$_N]} != 0 )) && continue 1 # 抽PallMall香烟的人养鸟
  86.           judge 2;if (( $_N \< 4 )) && (( ${_TMP3[$[$_N+1]]} == 2 ));then : # 抽Blends香烟的人住在养猫人的隔壁
  87.                 elif (( $_N \> 0 )) && (( ${_TMP3[$[$_N-1]]} == 2 ));then :
  88.                 else continue 1
  89.                   fi
  90.           judge 3;if (( $_N \< 4 )) && (( ${_TMP3[$[$_N+1]]} == 1 ));then : # 养马的人住在抽Dunhil香烟人的隔壁
  91.                 elif (( $_N \> 0 )) && (( ${_TMP3[$[$_N-1]]} == 1 ));then :
  92.                 else continue 1
  93.                   fi
  94.           delidding
  95.         done

  96.       done

  97.     done

  98.   done

  99. done
复制代码


  1. [13:08 root@ xinyv]# time ./a.sh
  2. #--------------------------------------------#
  3. house1  house2  house3  house4  house5

  4. norway  denmark english german  sweden

  5. yellow  blue    red     green   white

  6. water   tea     milk    coffee  beer

  7. dunhill blends  palmall prince  bluemaster

  8. cat     horse   bird    fish    dog
  9. #--------------------------------------------#

  10. real    0m14.219s
  11. user    0m7.521s
  12. sys     0m6.889s
复制代码

[ 本帖最后由 xinyv 于 2008-1-18 13:48 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2008-01-18 13:57 |只看该作者
学习了,真是牛

论坛徽章:
0
10 [报告]
发表于 2008-01-18 16:26 |只看该作者
看了几次没有看完
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP