免费注册 查看新帖 |

Chinaunix

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

求助一段shell [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-31 15:25 |只看该作者 |倒序浏览
10可用积分
有六只老虎,其中三只母老虎,每只母老虎分别带着一只小老虎。
有一条河,六只老虎都在河的东岸。
有一条船,每次只能载二只老虎。每只老虎(包括母老虎和小老虎)都会划船。
如果一只小老虎,其母亲不和它在一起,则会被其它母老虎吃掉(但不会被其它小老虎吃掉)。
问:如何才能把六只老虎平安地载到河的西岸?共有多少种不同的方法?

请用shell
有兴趣的来顶一下

最佳答案

查看完整内容

写了一个,好象能用。不过还有很多地方需要改进,并且没写注释。其中A a B b C c表示6只老虎,大写字母是大老虎,小写字母是小老虎。

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2008-12-31 15:25 |只看该作者
写了一个,好象能用。
不过还有很多地方需要改进,并且没写注释。
其中A a B b C c表示6只老虎,大写字母是大老虎,小写字母是小老虎。

  1. #! /bin/bash

  2. tiger=(A a B b C c)
  3. east=(1 1 1 1 1 1)
  4. west=(0 0 0 0 0 0)
  5. step=0
  6. method=()

  7. check()
  8. {
  9.         if echo "$*" | sed 's/ //g' | grep -Eq '(^01(..)?1)|(1.(..)?01$)|(^1.01)|(011.$)'
  10.         then
  11.                 return 1
  12.         else
  13.                 return 0
  14.         fi
  15. }

  16. get1()
  17. {
  18.         tmparr=($*)
  19.         for((i=0;i<=5;i++))
  20.         do
  21.                 [ "${tmparr[$i]}" -ne 0 ] && echo $i
  22.         done
  23. }

  24. get2()
  25. {
  26.         tmpset="{"
  27.         tmparr=($*)
  28.         for((i=0;i<=5;i++))
  29.         do
  30.                 [ "${tmparr[$i]}" -ne 0 ] && tmpset="$tmpset$i,"
  31.         done
  32.         tmpset="${tmpset%,}}"
  33.         { eval echo $tmpset$tmpset; } | tr ' ' '\n' | awk -F "" '$1<$2'
  34. }

  35. move()
  36. {
  37.         case "$1" in
  38.         e)
  39.                 for i in $(echo $2 | sed -r 's/(.)(.)/\1\n\2/')
  40.                 do
  41.                         east[$i]=0
  42.                         west[$i]=1
  43.                 done
  44.         ;;
  45.         w)
  46.                 for i in $(echo $2 | sed -r 's/(.)(.)/\1\n\2/')
  47.                 do
  48.                         east[$i]=1
  49.                         west[$i]=0
  50.                 done
  51.         ;;
  52.         esac
  53. }

  54. printmethod()
  55. {
  56.         eval echo \"$(echo $* | sed 's/[0-9]/${tiger[&]}/g')\"
  57. }

  58. river()
  59. {
  60.         for ei in $(get2 "${east[@]}")
  61.         do
  62.                 [ "$ei" = "${method[$step]//[^0-9]/}" ] && continue
  63.                 move e $ei
  64.                 if check "${east[@]}" && check "${west[@]}"
  65.                 then
  66.                         ((step++))
  67.                         method[$step]="$ei-->"
  68.                         if [ $(echo "${west[@]}" | tr ' ' '+' | bc) -eq 6 ]
  69.                         then
  70.                                 printmethod "${method[@]}"
  71.                                 move w $ei
  72.                                 ((step--))
  73.                                 return 0
  74.                         elif [ $step -eq 5 ]
  75.                         then
  76.                                 ind=$(get2 "${west[@]}")
  77.                         else
  78.                                 ind=$(get1 "${west[@]}")
  79.                         fi

  80.                         for wi in $ind
  81.                         do
  82.                                 [ "x$ei" = "x$wi" ] && continue
  83.                                 move w $wi
  84.                                 if check "${east[@]}" && check "${west[@]}"
  85.                                 then
  86.                                         ((step++))
  87.                                         method[$step]="$wi<--"
  88.                                         river
  89.                                         move e ${method[$step]//[^0-9]/}
  90.                                         ((step--))
  91.                                 else
  92.                                         move e $wi
  93.                                 fi
  94.                         done
  95.                         move w ${method[$step]//[^0-9]/}
  96.                         ((step--))
  97.                 else
  98.                         move w $ei
  99.                 fi
  100.         done
  101. }

  102. river
复制代码

论坛徽章:
0
3 [报告]
发表于 2008-12-31 15:27 |只看该作者
顶一个,期待ing...

论坛徽章:
0
4 [报告]
发表于 2008-12-31 15:29 |只看该作者
哇噻, 来考人来了

论坛徽章:
0
5 [报告]
发表于 2008-12-31 15:30 |只看该作者
是考算法的吧

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
6 [报告]
发表于 2008-12-31 15:38 |只看该作者
占个地方先,代码慢慢想。

论坛徽章:
0
7 [报告]
发表于 2008-12-31 15:40 |只看该作者
小虎在船上 其它的母老虎不吃它??

论坛徽章:
0
8 [报告]
发表于 2008-12-31 15:43 |只看该作者
直接晕了

论坛徽章:
0
9 [报告]
发表于 2008-12-31 15:44 |只看该作者
应该是排列组合吧?

我现在想到7种

论坛徽章:
0
10 [报告]
发表于 2008-12-31 15:44 |只看该作者
给高手们摆好板凳 嘿嘿
我也努力去想啊。。。
关键是要出模型。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP