漢諾塔問題解決演算法

2021-05-26 03:10:54 字數 1555 閱讀 5508

問題描述:

假設有3

個分別命名為x,

y,z的塔座,在塔座

x上插有

n個直徑大小各不相同、依小到大編號為1,

2,……n個圓盤。現要求將

x軸上的

n個圓盤移至塔座

z上並仍按同樣順序疊排,圓盤移動時必須遵守下列規則:(1

)每次只能移動乙個圓盤;(2

)圓盤可以插在x,

y和z中的任一塔座上;(3

)任何時刻都不能將乙個較大的圓盤壓在較小的圓盤之上。求n

個盤至少需移動的次數,並輸出移動的步驟。

演算法描述:

已知:a上有n

個盤子。 如果

n=1,則將圓盤從

a直接移動到c。

如果n=2,則: 1.

將a上的n-1(

等於1)

個圓盤移到b上;

2.再將a

上的乙個圓盤移到c上;

3.最後將b

上的n-1(

等於1)

個圓盤移到c上。

如果n=3,則:

a. 將a

上的n-1(等於2

,令其為

n`)個圓盤移到

b(借助於

c),步驟如下:

(1)將a

上的n`-1(

等於1)

個圓盤移到c上。

(2)將a

上的乙個圓盤移到b。

(3)將c

上的n`-1(

等於1)

個圓盤移到b。

b. 將a

上的乙個圓盤移到c。

c. 將b

上的n-1(等於2

,令其為

n`)個圓盤移到

c(借助

a),步驟如下:

(1)將b

上的n`-1(

等於1)

個圓盤移到a。

(2)將b

上的乙個盤子移到c。

(3)將a

上的n`-1(

等於1)

個圓盤移到c。

到此,完成了三個圓盤的移動過程。

從上面分析可以看出,當

n大於等於

2時,移動的過程可分解為三個步驟:

第一步把a

上的n-1

個圓盤移到b上;

第二步把a

上的乙個圓盤移到c上;

第三步把b

上的n-1

個圓盤移到

c上;其中第一步和第三步是類同的。 當

n=3時,第一步和第三步又分解為類同的三步,即把

n`-1

個圓盤從乙個針移到另乙個針上,這裡的

n`=n-1

。顯然這是乙個遞迴過程

實現**(

c語言):

#include

int cnt=0;

int main()

void hanoi(int n,char one,char two,char three)

else

}void move(char x,char y)

執行結果為:

蛙跳台階問題解決演算法

題目 乙隻青蛙可以一次跳上一級台階,也可以一次跳上二級,求該青蛙跳上乙個n級台階總共有多少種跳法1 解題思路 我們把n級台階的跳法看成是n的函式,記為f n 當n 2時,第一次調的時候就有兩種不同的選擇,一是第一次跳一級,則此時的跳法數目等於後面剩下的n 1級台階的跳法數目,即為f n 1 另一種選...

java 蛙跳台階問題解決演算法

題目 乙隻青蛙可以一次跳上一級台階,也可以一次跳上二級,求該青蛙跳上乙個n級台階總共有多少種跳法解題思路 我們把n級台階的跳法看成是n的函式,記為f n 當n 2時,第一次調的時候就有兩種不同的選擇,一是第一次跳一級,則此時的跳法數目等於後面剩下的n 1級台階的跳法數目,即為f n 1 另一種選擇是...

遞迴問題解決漢諾塔 C

includevoid hanoii char a,char b,char c,int n void main void hanoii char a,char b,char c,int n else 首先讓我們來看一看 c語言的實現方法 我們可以把所有情況都看做一種情況 即看作兩層漢諾塔。首先我們來...