出典:https://blog.csdn.net/computerme/article/details/18080511
再帰的なアルゴリズム:
/ * 汉诺塔递归算法* / 書式#include <iostreamの> 使用して 名前空間はstdを、 // 三つの柱放置し1,2および3の番号を使用 ボイド hanio(int型 N、INT から、INTに、INT {によって) 場合(N =!1 {) hanio(N - 1、から、によって、に); hanio(1、から、に、0 ); hanio(N - 1、によって、へ、から)。 } 他{ COUT << " 从" << から << " 放到" << <<にENDL。 } } int型のmain(){ int型N; cinを >> N; hanio(N、1、3、2 )。 coutの << " !「 << てendl; }
/ * ハノイの塔非再帰的アルゴリズム* / の#include <iostreamの> 使用して 名前空間STD; constの INT NMAXである= 64 ; 構造体柱{ int型[NMAXである]ストア; INT トップ、 チャー、ラベル INT {(トップ) を返すトップ- [ストア1 ]; } int型のPOP(){ トップ - ; 返すストア[トップ]; } ボイドプッシュ(INT X){ ストア[トップ] = X。 トップ ++ ; } }。 ボイド hanio(ピラーSS []、長いN){ int型のk = 0 。 int型私= 0 ; 一方、(K < N){ int型の TEMP = SS [I%3 ] .pop()。 SS [(I + 1)%3 ] .push(TEMP)。 COUT << TEMP << " 号从" << SS [I%3 ] .LABEL << " 移动到" << SS [(I + 1)%3 ] .LABEL << ENDL。 K ++ ; もし(K < N){ 場合(SS [(I + 2)%3 ] .top()== 0 || SS [(I + 2)%3 ] .top()> SS [(I)%3 ]。トップ()){ int型の TEMP = SS [(I)%3 ] .pop()。 SS [(I + 2)%3 ] .push(TEMP)。 COUT << TEMP << " 号从" << SS [(I)%3 ] .LABEL << " 移动到" << SS [(I + 2)%3 ] .LABEL << } 他{ int型の TEMP = SS [(I + 2)%3 ] .pop()。 SS [(I) %3 ] .push(TEMP)。 COUT << TEMP << " 号从" << SS [(I + 2)%3 ] .LABEL << " 移动到" << SS [(I)%3 ] .LABEL << ENDL。 } K ++ 。 } 私は ++します; } } 長いパウ(INT A、INT B){ 長いです ANS = 。 以下のために(int型 iは= 0 ; iは<B- 1 ; I ++ ){ ANS * = 。 } 戻りANS。 } ボイド初期化(柱試験[]、int型N){ 試験[ 0 ] .LABEL = ' A ' 。 試験[ 0 ] .Top = N。 試験[ 1 ] .Top =試験[ 2 ] .Top = 0 。 以下のために(int型 i = 0 ; iがn <; iは++ ){ 試験[ } 0] .store [I] = N- I。 試験[ 1 ] .store [I] =試験[ 2 ] .store [I] = 0 ; } もし、(N%2 == 0 ){ 試験[ 1 ] .LABEL = ' B ' 。 試験[ 2 ] .LABEL = ' C ' 。 } 他{ テストは[ 1 ] .LABEL = ' C ' 。 試験[ 2 ] .LABEL = ' B ' 。 } int型メイン(){ int型のn; cinを >> N; 柱の使用[ 3 ]。 (使用、n)を初期化します。 長い powAns =パウ(2、n)は- 1 。 hanio(使用、powAns)。 裁判所未満 << " こんにちは" << てendl; }