1. 程式人生 > >漢諾塔:最少移動次數&&路徑 遞迴

漢諾塔:最少移動次數&&路徑 遞迴


漢諾塔:

三個柱子:A,B,C,A有n個環,講n個環全部移動到C上,要求:

1>  移動次數最少;

2>  大環不能放在小環上。

輸入:

n(n<=10)

輸出 :

移動次數

路徑

例:

輸入:

3

輸出 :

    7

1 from A to C

2 from A to B

1 from C to B

3 from A to C

1 from B to A

2 from B to C

1 from A to C

分析:

次數:

顯然,n=1時只有一步,n=2時,有三步。

當n>2時,需要將前n-1個放到B柱,再將第n個放到C柱,最後再把前n-1個放回C柱,

用h陣列記第i個需要的步數,得h[i]=h[i-1]*2+1,1是將第n個放到C柱用1步。

路徑:將前n-1個看成一塊,將前n-1個和第n個用 當n=2 時的方法將n個放到C柱,前n-1個再分為前n-1和第n個 即 前n-2和第n-1個。

程式:

#include<iostream>
#include<algorithm>

using namespace std;

int k,n;

void mov(int n,char a,char c,char b){   //路徑
	if(n==0) return ;
	mov(n-1,a,b,c);
	cout<<n<<" from "<<a<<" to "<<c<<endl;
	mov(n-1,b,c,a);
}
int h[110];       //次數
int hnt(int n){
	h[1]=1;
	h[2]=3;
	for(int i=3;i<=n;++i) h[i]=2*h[i-1]+1;
	return h[n];
}

int main()
{
	cin>>n;
	cout<<hnt(n)<<endl;
	mov(n,'A','C','B');
	return 0;
}

相關推薦

最少移動次數&&路徑

漢諾塔: 三個柱子:A,B,C,A有n個環,講n個環全部移動到C上,要求: 1>  移動次數最少; 2>  大環不能放在小環上。 輸入: n(n<=10) 輸出 : 移動次數 路徑

圖解,用Python實現經典

感謝漂流的雲的圖解漢諾塔問題(遞迴求解) (1)先從最簡單的模型開始,假如A柱有2個盤,我們的任務是把這兩個盤按照規則(小疊在大上)移到C柱。操作步驟如下所示: (2)現在把原始時A柱盤子數增加到100,那步驟不言而喻變得很複雜,但是我們可以通過一種方法把複雜的問題簡單化: 可能此時你會

關於的一些個人看法(

漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動

LeetCode最少移動次數使得數組元素相等||【462】

true 移動 邏輯 描述 假設 ++i 動作 數組元素 brush LeetCode:最少移動次數使得數組元素相等||【462】 題目描述 給定一個非空整數數組,找到使所有數組元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。 您可以假設數組的長度最多

的故事(C語言——歸)

code log 圓盤 印度 return 16px move class baidu 漢諾塔:   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤

迭代和(Python)--乘方、最大公約數、、斐波那契、文字串

1.迭代 def iterPower(base,exp): result=1.0 while exp>0: result*=base exp-=1 return result 執行結果: 2.遞迴的乘法運算:

四根柱子處理問題的最少次數

經典的漢諾塔問題經常作為一個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。

3個最少移動次數

最少次數是有規律的:有1號,2號,3號……盤從小到大   1.當只有一個盤時,移動到目標塔上時為2^0;   2.當有兩個盤時,1號盤移動到目標塔上時為2^(n-1);   3.有三個盤時,1號盤移動目標塔上時為2^(n-1);按此規律便可以得出有n盤時,1號,2號,3號……

C / C++ 移動路線和移動次數問題

題目內容   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小

移動

pri -- nbsp else == move 漢諾塔 int bsp 學習python進行中: def move(n, a, b, c): if n ==1: print a,‘-->‘,c else: move(n-1,a,c

(河內)問題

漢諾塔 medium 問題 http int logs 一行 移動 else     漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小

課後作業2歸編程解決問題

args 漢諾塔問題 char ext n) 兩個 port one input 【程序設計思想】 將A座上盤子移到C座上,實現的操作:1,將A座上除最下面其余盤子移到B座上2,將A座上一個盤子移到C座上3,將B座上盤子移到C座上。

課程作業03歸方法計算組合數、解決問題、判斷某個字符串是否回文

java class ply math alt static multi 構造 strong 課後作業1:使用計算機計算組合數 (1)使用組合數公式利用n!來計算 程序設計思想: 設計並調用大數求階乘的方法結合組合數公式計算組合數的值。 程序流程圖: 程序源代碼

題解報告hdu1995V

pre clas gpo style bit body turn 規律 class 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1995 解題思路:求第k號盤子至少需要移動的次數,實際上是求n-k(認作是前g-1個盤子移動的

題解報告hdu1996VI

http blog clu AC 鏈接 using 選擇 acm c++ 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1996 解題思路:每個盤子有3種選擇,故系列總數為3^n。(水題!!!) AC代碼: 1 #incl

經典題目-移動 https://www.cnblogs.com/dmego/p/5965835.html

一.起源:   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個

《零基礎入門學習Python》(24)--

前言 這節課主要講解用遞迴的方法,實現漢諾塔的解答  知識點 這節課主要講解用遞迴的方法,實現漢諾塔的解答  對於遊戲的玩法,我們可以簡單分解為三個步驟: 1) 將前63個盤子從X移動到Y上。  2) 將最底下的第64個盤子從X移動

第023、024講這幫小兔崽子、

目錄 動動手 0. 使用遞迴編寫一個十進位制轉換為二進位制的函式(要求採用“取2取餘”的方式,結果與呼叫bin()一樣返回字串形式)。 1. 寫一個函式get_digits(n),將引數n分解出每個位的數字並按順序存放到列表中。 2. 還記得求迴文字串那道題嗎?現在讓你使用遞迴的方式

每週一演算法(1)

首先漢諾塔是使用遞迴一個非常經典的例子, 歷史故事說了也沒用,我們想象原理。 前提,三根柱子ABC,將A上的盤子數按順序挪到C,每次只能一個 1. 一個盤子,A->C 2. 兩個盤子  A->B, A->C, B->C 3. 大於兩個盤子,那

問題

1.題目 2.思路     1、把A上面n-1個盤子移動到B上。    2、把A上最後一個移動到C;    3、把B上n-1個移動到A上,再把B上最後一個移動到C; 如此