演算法 漢諾塔問題
做一個豁達而努力的自己。
漢諾塔問題是一個典型的遞迴問題,其實也就是按照自己思路寫出來就行了,,,
有3柱塔A,B,C,A為初始塔,B為藉助塔,C為目標塔,,,
目標是要將A上的圓盤藉助B運到C,
規則:1.每次只能移動一個圓盤,
2.圓盤可以放到A,B,C中任意一個塔上,
3.任意時刻不可以將較大圓盤放在較小圓盤上面,
分析(藉助程式碼):
當A上只有1個圓盤時,直接可以將圓盤運到C,
當A上有2個圓盤時,先將1號(最上面的小的)圓盤運到B上,再將2號圓盤運到C上,再將1號圓盤從B運到C上,
當A上有3個圓盤時,先將1,2號圓盤運到B上,再將3號圓盤運到C上,再將1,2號圓盤從B運到C上,
當A上有n個圓盤時,先將n-1個圓盤運到B上,再將n號圓盤運到C上,再將n-1個圓盤從B運到C上,
其實也就是按著這個思想,寫函式就可以了,,,
程式碼:
#include <iostream> using namespace std; void move(int n, char a, char c) { cout << n << " " << a << " -> " << c << endl;; } void Hannuota(int n, char a, char b, char c) { if(n == 1) //當A中只有一個圓盤時,將1號盤從A移動到C上 move(1, a, c); else { Hannuota(n - 1, a, c, b); //將n-1個圓盤從A藉助C移動到B上 move(n, a, c); //將最後的n號盤從A移動到C上 Hannuota(n - 1, b, a, c); //再將n-1個盤從B藉助A移動到C上 } } int main() { char a = 'A', b = 'B', c = 'C'; int n; cout << "輸入A塔上圓盤的個數:"; cin >> n; Hannuota(n, a, b, c); return 0; }
執行結果:
相關推薦
經典遞迴演算法 漢諾塔
函式的遞迴 前進(規模縮小),邊界條件,返回段,自己呼叫自己 在寫漢諾塔之前 先給大家介紹下遞迴演算法 舉個例子:我要寫一個我自己的列印函式 Myprint()將12345 這個數 挨個數字 打印出來 void MyPrint(int n) { if(n > 10) M
演算法-漢諾塔-python3實現
0.摘要 本文使用python3實現漢諾塔問題。 1.問題闡述與分析 有三個柱子A,B,C,每個柱子上都可以放置圓盤。最初,所有圓盤都在A柱子上,需要把所有圓盤都移動到C柱子上。 要求: 1.每次只移動一個圓盤 2.只能移動柱子最上面的圓盤 3.保證每根柱
【資料結構】遞迴演算法—漢諾塔
漢諾塔的問題,也是一個經典的遞迴演算法問題。 下面是自己總結的一張整體流程圖。 下面是程式碼,程式碼雖簡單,但理解其內部執行原理很重要。 //=========================
演算法:漢諾塔(棧的遞迴呼叫)-資料結構(9)
一、問題描述 參見網上漢諾塔的玩法。書上P54-58。解析:棧的遞迴呼叫其實是函式引數是以棧的形式push進棧來呼叫函式的,因此遞迴是用到棧的,只是沒有很形象而已。解決漢塔的思路是這樣的:設n為漢諾塔
遞迴演算法——漢諾塔問題
題目: 有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動? 解答過程: import java.util.Scanner
演算法 漢諾塔問題
做一個豁達而努力的自己。漢諾塔問題是一個典型的遞迴問題,其實也就是按照自己思路寫出來就行了,,,有3柱塔A,B,C,A為初始塔,B為藉助塔,C為目標塔,,,目標是要將A上的圓盤藉助B運到C,規則:1.每
Python漢諾塔問題遞迴演算法與程式
漢諾塔問題: 問題來源:漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤,只能移動在最頂端的圓盤。有預言說
演算法之漢諾塔
演算法的概念 計算過程,解決問題的方法 Niklaus Wirth: '程式=資料結構+演算法' 時間複雜度 看下面四組程式碼時間執行最短的是哪個? print('hello world') O(1) for i in range(n): O(n) print('hello
演算法之路(四)----漢諾塔(又稱河內之塔)
漢諾塔是很簡單也很經典的演算法之一。 漢諾塔是根據一個傳說形成的數學問題: 有三根杆子A,B,C 。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: * 1 每次只能移動一個圓盤; * 2 大盤不能疊在小盤上面。 提示:可將圓
遞迴演算法處理漢諾塔
package com.cn.ygm.hanoiTower; public class HanoiTower { /** * 移動盤子 * topN:移動的盤子數 * from:起始塔座 * inter:中間塔座 * to:目標塔座
每週一演算法(1):漢諾塔
首先漢諾塔是使用遞迴一個非常經典的例子, 歷史故事說了也沒用,我們想象原理。 前提,三根柱子ABC,將A上的盤子數按順序挪到C,每次只能一個 1. 一個盤子,A->C 2. 兩個盤子 A->B, A->C, B->C 3. 大於兩個盤子,那
資料結構與演算法題目集7-17——漢諾塔的非遞迴實現
我的資料結構與演算法題目集程式碼倉:https://github.com/617076674/Data-structure-and-algorithm-topic-set 原題連結:https://pintia.cn/problem-sets/15/problems/821 題目描述:
【演算法】漢諾塔問題 Hanoi Tower
題目內容 漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大
基礎演算法學習——遞迴(漢諾塔)
#include<stdio.h> int count=0; void move (int n,char x,char y) { printf("第%d次,將%d號盤從%c移到%c上\n",++count,n,x,y); } void hanoi(int n,char A,char
漢諾塔的遞迴實現演算法詳解
這裡我們再詳細地介紹一下漢諾塔的移動原理,假設三根柱子分別是 A、B、C,一開始 A 上有 N 個圓盤,從小到大、從上到下分別是 1、2……N-1、N,我們要把 A 上的 N 個圓盤全部移動到 C 上面,且每次只能移動每根柱子最上面的一個圓盤。 我們可以反過來考慮一下,若要把 A 上的圓盤全部移動到 C 上
第二章 演算法效率分析基礎 page 55 漢諾塔問題
漢諾塔問題介紹: 在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的
Problem A: 深入淺出學演算法022-漢諾塔問題II
#include<stdio.h> void hanio(int n,char a,char b,char c) { if(n==1) printf("%c->%c\n",a,c); else{ hanio(n-1,a,c,b);
遞迴演算法與漢諾塔問題
一、遞迴演算法 遞迴是一種常見的解決問題的演算法,即把問題逐漸簡單化。遞迴的基本思想就是“自己呼叫自己”,一個使用遞迴技術的方法將會直接或者間接的呼叫自己。 遞迴結構包括兩個部分: 定義遞迴頭:說明什麼時候不呼叫自身方法,因為如果沒有定義遞迴頭,將陷入
java漢諾塔遞迴演算法
相傳在古印度聖廟中,有一種被稱為漢諾塔(Hanoi)的遊戲。該遊戲是在一塊銅板裝置上,有三根杆(編號A、B、C),在A杆自下而上、由大到小按順序放置64個金盤(如下圖)。遊戲的目標:把A杆上的金盤全部移到B杆上,並仍保持原有順序疊好。操作規則:每次只能移動一個盤
演算法-基礎和查詢-1.漢諾塔/2.順序查詢/3.二分查詢/4.順序查詢和二分查詢的比較
1.漢諾塔: 如下圖所示,需要將A柱子中的所有圓盤按照從小到大的順序移動到C柱子上,並且在移動過程中大圓盤不能在小圓盤上面 分析問題:最終希望呈現的結果是將A柱子上的盤子全部按照從小到大的順序移動到C柱子上 1.n個盤子,將n-1視為一個整體 2.將n-1個盤子視為一個