1. 程式人生 > >遞迴解決 Tower of Hanoi 問題

遞迴解決 Tower of Hanoi 問題

     自己感覺寫的沒有原博主的那麼容易理解,於是就站在巨人的肩膀上摘蘋果,感謝部落格主。

演算法:當只有一個盤子的時候,只需要從將A塔上的一個盤子移到C塔上。

            當A塔上有兩個盤子是,先將A塔上的1號盤子(編號從上到下)移動到B塔上,再將A塔上的2號盤子移動的C塔上,最後將B塔上的小盤子移動到C塔上。

            當A塔上有3個盤子時,先將A塔上編號1至2的盤子(共2個)移動到B塔上(需藉助C塔),然後將A塔上的3號最大的盤子移動到C塔,最後將B塔上的兩個盤子藉助A塔移動到C塔上。

           當A塔上有n個盤子是,先將A塔上編號1至n-1的盤子(共n-1個)移動到B塔上(藉助C塔),然後將A塔上最大的n號盤子移動到C塔上,最後將B塔上的n-1個盤子藉助A塔移動到C塔上。

          綜上所述,除了只有一個盤子時不需要藉助其他塔外,其餘情況均一樣(只是事件的複雜程度不一樣)。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
// 第一個是初始塔 第二個是轉移塔 第三個是目的塔,
int i=1;
void Move(int n,char from,char to)
{
    printf("第%2d步:將%d號盤子從%c移至%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char depend_on,char to)
{
    if(n==1)
        Move(n,from,to);// 最後一個盤子,就直接從初始塔移到目的塔
    else
    {
        hanoi(n-1,from,to,depend_on);// 藉助目的塔將前n-1個盤子從初始塔移至轉移塔。
        Move(n-1,from,to);
        hanoi(n-1,depend_on,from,to);// 藉助初始塔將轉移塔上的n-1個盤子移至目的塔。
    }
    // 仔細想一下 就能 感受到遞迴的強大。
}
int main()
{
    int n=3;
    char x='a',y='b',z='c';
    hanoi(n,x,y,z);
    return 0;
}


相關推薦

解決 Tower of Hanoi 問題

     自己感覺寫的沒有原博主的那麼容易理解,於是就站在巨人的肩膀上摘蘋果,感謝部落格主。 演算法:當只有一個盤子的時候,只需要從將A塔上的一個盤子移到C塔上。             當A塔上有兩個盤子是,先將A塔上的1號盤子(編號從上到下)移動到B塔上,再將A塔上

漢諾塔問題(The Tower of Hanoi)的歸算法與非歸算法

for log col 遞歸 post struct () def ini 非遞歸算法:   根據圓盤的數量確定柱子的排放順序:     若n為偶數,按順時針方向依次擺放 A B C;     若n為奇數,按順時針方向依次擺放 A C B。   然後進行如下操作:   (1

漢諾(Hanoi)塔問題的解決

漢諾塔問題: 古代有一個塔,塔內有3個座A、B、C,開始時A座有64個盤子,盤子大小不相等,大的在下,小的在上。有一個老和尚想把這64個盤子從A座移動到C座,但每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程中可以利用B座,

One usage of recurison: the tower of Hanoi

fill char raw system tex ogre tin reason efi Statements: This blog was written by me, but most of content is quoted from book【Data

列表形式的漢諾塔(Tower of Hanoi)Python語言實現

c語言指針 CA 指針 c語言 字符串 oba 小時 span 形式 從昨天半下午就開始想這個問題,到現在經過30個小時左右(期間並不思考是非常集中,因為連續思考很累而且可能效果不佳),終於把程序搞定了,第一次思考問題這麽久.算是第一個自主思考的程序還是很有成就感的. 代碼

解決全排列生成演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

經典解決漢諾塔!

演算法:當只有一個盤子的時候,只需要從將A塔上的一個盤子移到C塔上。             當A塔上有兩個盤子是,先將A塔上的1號盤子(編號從上到下)移動到B塔上,再將A塔上的2號

解決求最大公約數問題

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body>

Java解決n皇后問題

題目 八皇后問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后?這道題目也可以稍微延伸一下,變為 N×N的棋盤上放置N個皇后,其他條件相同。 下面介紹一種比較簡單易懂的實現方式。 程式碼 impo

解決分魚問題

A、B、C、D、E這5個人合夥夜間捕魚,凌晨時都已經疲憊不堪,於是各自在河邊的樹叢中找地方睡著了。第二天日上三竿時,A第一個醒來,他將魚平分為5份,把多餘的一條扔回河中,然後拿著自己的一份回家去了;B第二個醒來,但不知道A已經拿走了一份魚,於是他將剩下的魚平分為5份,扔掉多餘的一條,然後只拿走了自己

使用JavaScript實現解決斐波那契數列及優化

遞迴的概念:若一個演算法直接地或間接地呼叫自己本身,則稱這個演算法是遞迴演算法(《資料結構—使用C語言實現;朱戰立;西安交大出版社》); 遞迴的兩個條件:自己呼叫自己和有結束條件(否則是死遞迴) 斐波那契數列 1, 1, 2,3,5,8,13,21….. 使

LeetCode 206. 反轉連結串列 解決

反轉一個單鏈表。 示例: 輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL 進階: 你可以迭代或遞迴地反轉連結串列。你能否用兩種方法解決這道題? 注意head是有

C語言解決fibonacci數列演算法

斐波那契數列的遞迴條件是 F(n)=1   n=0, F(n)=1   n=1, F(n)=F(n-1)+F(n-2)   n>1; 可以直接寫出遞迴函式 int f(int n) { if(n<=1) retu

C語言解決階乘問題

遞迴函式的概念是:直接或者間接地呼叫自身的演算法 遞迴函式:用函式自身給出定義的函式 而且在學習的後期  學到了分治法可以感覺到分治法產生的子問題是原問題的較小模式,這就為使用遞迴技術提供了不小的方便 即在合適的情況,使用遞迴反覆分治,大問題變相同性質的小問題,再進行遞迴求解 今天

解決漢諾塔

漢諾塔簡介 大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。 經典題目:

解決揹包問題

問題描述:有不同價值、不同重量的物品n件,求從這n件物品中選取一部分物品的方案,使得選中物品的總重量不超過指定的限制重量,但選中的物品總價值最大。 揭解法描述:採用遞迴尋找物品的尋找方案。設前面已有多種選擇方案,並保留其中總價值最大的方案與一個數組option

演算法(1)整數劃分問題之解決

  今日,閱讀《ACM/ICPC 演算法訓練》時,發現一道名為“整數劃分”的題,書上解釋極為模糊,自己研究了一下此題,將其解決,記錄下解題思路,以備以後有用時快速理解;   一,題意簡述   將整數表示成一系列正整數之和:n=n1+n2+.....+nk;   注意:4+2

解決全排列問題+詳細圖解執行

問題描述:字串的排列 //輸入一個字串, 按字典序打印出該字串中字元的所有排列。 //例如輸入字串abc, 則打印出由字元a, b, c所能排列出來的所有字串abc, acb, bac, bca, cab和cba。 //結果請按字母順序輸出。 //長度不超過9(可能有字

python資料結構學習筆記-2017-01-08-01-N皇后問題、迷宮問題和跳馬問題的解決

        N皇后問題         棋盤ADT #-*-coding: utf-8-*- # 二維陣列實現棋盤ADT from myarray2d import Array2D class Board(object): def __init__(se

java利用解決八皇后問題

問題簡介: 要求在一個8*8的棋盤上放置8個皇后,使任意兩個皇后都不同行不同列且不在同一條斜對角線上。採用遞迴和回溯的思想解決這一問題是較為直觀的。一開始,棋盤上的任意格子都可落子,因此可任意選擇第一個皇后的位置。放置了第一個皇后之後,棋盤上的可落子格子的分佈將發生改變,然