問題描述:
河內之塔 (Towers of Hanoi) 是法國人 M.Claus(Lucas) 於 1883 年從泰國帶至法國的,河內為越戰時
北越的首都,即現在的胡志明市; 1883 年法國數學家 Edouard Lucas 曾提及這個故事,據說創 世
紀時 Benares 有一座波羅教塔,是由三支鑽石棒( Pag )所支撐,開始時神在第一根棒上放置 64
個由上至下依由小至大排列的金盤( Disc ),並命令僧侶將所有的金盤從第一根石棒移至第三 根
石棒,且搬運過程中遵守大盤子在小盤子之下的原則,若每日僅搬一個盤子,則當盤子全數搬
運完畢之時,此塔將毀損, 而也就是世界末日來臨之時。建模求解出移動的具體過程。
答案:
#include <stdio.h>static int nCount = 0;void MoveTower( int n, char A, char B, char C ){//解法 如果柱子標為 ABC ,要由 A 搬至 C ,在只有一個盤子時,就將它直接搬至 C ,當有兩個盤//子,就將 B 當作輔助柱。如果盤數超過 2 個,將第三個以下的盤子遮起來,就很簡單了,每次 處//理兩個盤子,也就是: A->B 、 A ->C 、 B->C 這三個步驟,而被遮住的部份,其實就是進入程式//的遞迴處理。/if( n>0 ){if( 1==n ){printf( "%d-->Move sheet %d From %c To %c\n", ++nCount, n, A, C );}else{MoveTower( n-1, A, C, B );printf( "%d-->Move sheet %d From %c To %c\n", ++nCount, n, A, C );MoveTower( n-1, B, A, C );}}}int main(int argc, char *argv[]){MoveTower( 5, 'A', 'B', 'C' );return 0;}
Java版
public class Tower{static int nCount = 0;public static void main( String args[] ){MoveTower( 5, 'A', 'B', 'C' );}static void MoveTower( int n, char A, char B, char C ){//解法 如果柱子標為 ABC ,要由 A 搬至 C ,在只有一個盤子時,就將它直接搬至 C ,當有兩個盤//子,就將 B 當作輔助柱。如果盤數超過 2 個,將第三個以下的盤子遮起來,就很簡單了,每次 處//理兩個盤子,也就是: A->B 、 A ->C 、 B->C 這三個步驟,而被遮住的部份,其實就是進入程式//的遞迴處理。/if( n>0 ){if( 1==n ){System.out.println( ++nCount+"->Move sheet "+n+" From "+A+" To "+C+"\n" );}else{MoveTower( n-1, A, C, B );System.out.println( ++nCount+"->Move sheet "+n+" From "+A+" To "+C+"\n" );//printf( "%d-->Move sheet %d From %c To %c\n", ++nCount, n, A, C );MoveTower( n-1, B, A, C );}}}}