問題
由 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
分析待補充