【SHELL】 3个汉诺塔的实现

3个汉诺塔的实现。汉诺塔的问题的具体描述就不再重复了。直接上代码。

1 #!/bin/bash
  2 Time_Initial=`date "+s:%s"|awk -F":" '{printf($2)}'`
  3 a=a             #A柱,也可以理解为源柱。
  4 b=b             #B柱,也可以理解为缓存柱。
  5 c=c             #C柱,也可以理解为目的柱。
  6 hanoi()
  7 {       
  8         if [ $1 = "1" ];then
  9                 echo "$2 -> $4"                         #最后一步(即当步数为1时),把最后一个盘子
    从A柱挪到C柱
 10         let num+=1      
 11                         return 0
 12         else    
 13                 {       
 14                         hanoi $[$1-1] $2 $4 $3          #中间状态前的一步,需要将B柱空出来为下一
    步做准备。因此要把A柱的n-1个盘子都挪到B柱中。
 15                         echo "$2 -> $4"                 #和最后状态一样的中间状态,此时C柱是最大
    的盘子,相当于于没有盘子,要做的就是讲A柱的盘子放到C柱中。当$1=1时,就是最后一步。
 16                         let num+=1
 17                         hanoi $[$1-1] $3 $2 $4
 18                 }
 19         fi
 20 }
 21 read -p "please input the numbers of disk:" n;
 22 hanoi $n $a $b $c
 23 echo ${num}
 24 Time_End=`date "+s:%s"|awk -F":" '{printf($2)}'`
24 Time_End=`date "+s:%s"|awk -F":" '{printf($2)}'`
 25 printf "Cost of time is %3d"$(($Time_End-$Time_Initial))"\n"
 26 exit 0
 27 ##      为了方便大家理解,下面是分解到每一步的动作:
 28 ##              源柱 缓存柱 目的柱
 29 ##初始           A      B     C
 30 ##N-2次移动后……
 31 ##N-1            A      C     B     此布是N-1个盘以A为源柱,C为缓存住,移动到B柱。完成后,N-1个>    盘都:移动到B柱,C柱空出,变为下一步的缓存柱,
 32 ##               A      ->    C     N-1步完成后,C柱空出(这里不要单纯的理解为编号为C的柱,而应该
    理解为是缓存柱),将A柱的N盘(最大盘)移动到C盘。即A->C,此时A柱空出,变成缓存柱。当N=1时,最后一个>    盘移动到C柱,游戏结束。
 33 ##(N-)-1         B      A     C     上一步完成后,N盘根据规则可以认为已经消失了,N-1盘为最大,是上
    一步的N盘,(N-1)-1就是上一步的N-1盘。此时就需要把剩下的(N-1)-1个盘,以B为源柱,以A柱为缓存柱,向C    柱移动.这个就是一个递归的入口。
 34 ##      因此,递归函数的实质为 移动(盘个数,源柱,缓存柱,目的柱).

 

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/huaxin820518/article/details/81562293
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞