遲到了了一年的遞歸問題分析-漢諾塔問題

文章目錄

問題

在這裏插入圖片描述

由 A 移到 C, 以 B 爲輔助. 一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數

分析

當有三個盤子時候,
可以理解爲, 先把1,2 這一組盤子, 通過一些操作從A移動到B上,
然後把A中剩下的3從A移到C上,
最後再把B上的1,2這一組, 通過一些操作, 從B移到C

實現

/*** 
/*** 
 * @Author      : acmaker
 * @Date        : 2020-03-25 11:52:02
 * @LastEditTime: 2020-03-25 11:59:14
 * @FilePath    : \myCPlusPlusCode\DataStructure\Stack\hanoi.cpp
 * @Website     : http://csdn.acmaker.vip
 * @Description : 
 */


#include <bits/stdc++.h> 
using namespace std; 
#define rg register 
#define sc scanf 
#define pf printf 
typedef long long ll; 

int cnt = 0;

void move ( int num, char start, char end ) {
    ++cnt;
    pf( "第%d次, 將%d號圓盤 : %c -> %c\n", cnt, num, start, end );
}

/*** 
 * @description: 從 start 移到 end, 以 temp 爲輔助
 * @param : num爲需要移動的盤子編號
 * @return: 
 */
void hanoi ( int num, char start, char end, char temp ) {
    if ( num==1 ) {
        move( 1, start, end ); // 將編號爲 1 的圓盤移到終點end
        return;
    }
    hanoi( num-1, start, temp, end ); // 將編號爲 n-1 的圓盤移到temp, 以end爲輔助
    move( num, start, end ); // 將編號爲 num 的圓盤移動到end
    hanoi( num-1, temp, end, start ); // 將編號爲 n-1 的圓盤移到end, 以start爲輔助
}

int main ( ) {  // freopen( "F:\\in\\.txt" , "r" , stdin ); 

    hanoi( 3, 'A', 'C', 'B' );




    return 0 ; 
} 

結果如下

第1次, 將1號圓盤 : A -> C
第2次, 將2號圓盤 : A -> B
第3次, 將1號圓盤 : C -> B
第4次, 將3號圓盤 : A -> C
第5次, 將1號圓盤 : B -> A
第6次, 將2號圓盤 : B -> C
第7次, 將1號圓盤 : A -> C

分析待補充

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章