问题
由 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
分析待补充