1. 程式人生 > >【SHELL】 3個漢諾塔的實現

【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 ##      因此,遞迴函式的實質為 移動(盤個數,源柱,快取柱,目的柱).