漢諾塔是典型的遞迴問題,這個問題可以這樣描述:
完成目標:將n個block塊從a搬運到c,求需要移動多少次完成?
約束條件:搬運的過程中每次只能移動乙個block塊,且不能出現大的block塊在小的block塊之上。
詳細分析如下:
為了分析將a中的n個block搬到c中,我們先分析一下n分別等於1,2,3的簡單情況,在進行搬運之前我們有如下約定:
1、move(n,a,b,c)表示將n個block從a借助b搬到c中
2、move(1,a,c,b)表示將1個block從a搬到b中
第一種情況:
n = 1,將a中的①直接移動到c move(1,a,b,c)(直接從乙個柱移動到另乙個柱)
第二種情況:
n = 2,分3步
第一步:將①從a移動到b move(1,a,c,b)(直接從乙個柱移動到另乙個柱)
第二步:將②從a移動到c move(1,a,b,c)(直接從乙個柱移動到另乙個柱)
第三步:將①從b移動到c move(1,b,a,c)(直接從乙個柱移動到另乙個柱)
第三種情況:
n = 3,分三步
第一步:將①和②從a借助c搬到b move(2,a,c,b)
第二步:將③從a搬到c move(1,a,b,c)(直接從乙個柱移動到另乙個柱)
第三步:將①和②從b借助a搬到c move(2,b,a,c)
在這裡我們進一步看一下第一步的move(2,a,c,b)和第三步的move(2,b,a,c)
1、將①和②從a借助c搬到b,move(2,a,c,b),其實又包含3個簡單的步驟:
先將①從a搬到c,move(1,a,b,c);然後將②從a搬到b,move(1,a,c,b);最後將①從c搬到b,move(1,c,a,b)
2、將①和②從b借助a搬到c, move(b,a,c),其實也包含3個簡單的步驟:
先將①從b搬到a,move(1,b,c,a);然後將②從b搬到c,move(1,b,a,c);最後將①從a搬到c,move(1,a,b,c)
好了,到這裡就已經實現了n = 3的漢諾塔移動 是不是有點繞?其實自己在本子上畫一下挺簡單的,只是我把他寫複雜了而已...
畫了個圖,假裝看起來簡潔點:
可以看到最後的每一步操作都是到位的,也就是可以直接將block塊從乙個柱移動到另乙個柱。
第四中情況:
block為n的時候,分三步
第一步:將a中前n-1個block塊借助c搬到b中 move(n-1,a,c,b)
第二步:將a中的第n個block塊搬到c中 move(1,a,b,c)
第三步:將b中的n-1個block塊借助a搬到c中 move(n-1,b,a,c)
那麼第一步move(n-1,a,c,b)和第三步move(n-1,b,a,c)的實現又可以重複利用同樣的思想,直到n-2,n-3,,,3,2,1就可以直接一步到位如move(1,a,b,c).
c++實現:
#include using namespace std;
void move(int n,char a,char b,char c);
int step;
int main()
void move(int n,char a,char b,char c)
{ if(n==1)
{step++;
cout<
漢諾塔c 實現
用c 實現了漢諾塔,使用了遞迴,使用了上一次實現的堆疊這個資料結構來實現的漢諾塔,下面是 stack.h main.cpp stackdemo created by xin wang on 4 15 15.include class outofbounds 刪除定義的陣列 bool isempty ...
C 遞迴實現漢諾塔
a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...
C 漢諾塔遞迴實現
程式背景 漢諾塔 tower of hanoi 又稱河內塔,問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之...