漢諾塔的遞迴演算法很容易理解,也非常容易實現。下面,本文討論了漢諾塔問題的非遞迴演算法,核心內容就是棧的使用技巧。
首先,對於每個柱子來說,就是乙個棧,這個棧有個特點就是,大數放在下面,小數放在上面。在首次建立棧時,我們可以先儲存好這些資料,假設最小的盤子序號為1,後面的由此類推。在建立棧時,根據當前盤子總數是否為偶數,需要調整b、c兩個柱子的位置。當n為偶數時,按照a、b、c的順序排放三個柱子,當n為奇數時,按照a、c、b的順序排列這些柱子。這兩個順序就是漢諾塔中最小的那個盤子的挪動順序。
其次,建立好棧後,接下來就是演算法的核心部分了。初始情況下,需要首先挪動最小的那個盤子,把編號為1的那個盤子挪動到它的下乙個位置上(有可能是b,也有可能是c),這時需要判斷一下,程式是否已經完成了,若還沒有完成,則繼續下面的步驟。下一步,判斷當前剩下的兩個柱子的棧頂元素,如果有個棧頂元素為0,說明該柱子上沒有盤子,把非零的棧頂元素放入空棧中;如果兩個棧頂元素都是非零的,則將較小的元素移動到較大的元素上面。
再次,此時一輪迴圈已經結束,再次移動編號為1的盤子,將它移動到它的下乙個位置上面。
最後,重複上面的步驟,當迴圈結束時,我們的演算法就執行完了。
//#include "stdafx.h"
#include
using
namespace
std;
const
int max = 64;
struct st
else
}int pop( void )
void push( int data )
};long
int expo( int x, int y )
return retval;
}void createhanoi( st pillar, int n )
pillar[0].topindex = n;
for( int i = 0; i < n; i++ )
pillar[2].topindex = pillar[1].topindex = 0;
if( n%2 == 0 )
else
}int _tmain(int argc, _tchar* argv)
st pillar[3];
createhanoi( pillar, n );
int max = expo( 2, n ) - 1; // move n disks need max steps.
int k = 0; // record the current move steps.
int j = 0; // record 1st disk's position.
while( k < max )
漢諾塔非遞迴演算法
輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出 輸入樣例 3輸出樣例 a c a b c b a c b a b c 乙個美國學者總結得到 所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c 第二步 對a...
漢諾塔問題遞迴與非遞迴演算法
漢諾塔問題描述如下 有 a b c 3 根針,n 個圓盤 從 1.n 從上到下,按小到大順序放在 a 處,要求每次移動乙個,並保持從小到大的疊放順序,利用 c,把 n 個盤子移動到 b 處。遞迴演算法比較容易理解 fn hanoi n hanoi move n,a b c fn hanoi move...
非遞迴 遞迴 漢諾塔演算法實踐
漢諾塔演算法是很多公司的面試題,經常會讓手寫,這裡總結了一下 1 最最最常見的也是最簡單的漢諾塔演算法,遞迴 這也是學習遞迴的乙個經典演算法題 漢諾塔演算法 遞迴 ps 列印移動過程 param level 層數 param from 起始位置 param to 目標位置 param other 多...