算法思想:
汉诺塔有三个塔座,假设为A,B,C。
移动布步骤:
第一步:如果只有一个盘子的话,可以直接A塔座上移动到B塔座上;
第二步:如果有n个盘子的话,先把n-1个盘子借助C塔座移动到B塔坐上;
把第n个盘子从A塔坐上移动到C塔坐上;
把n-1个盘子从Y塔座借助C塔座移动A塔座上;
重复上述条件,直到n==1时,结束算法
图解;
如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
解:(1)n == 1
第1次 1号盘 A---->C sum = 1 次
(2) n == 2
第1次 1号盘 A---->B
第2次 2号盘 A---->C
第3次 1号盘 B---->C sum = 3 次
(3)n == 3
第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 sum = 7 次
不难发现规律:1个圆盘的次数 2的1次方减1
2个圆盘的次数 2的2次方减1
3个圆盘的次数 2的3次方减1
。 。 。 。 。
n个圆盘的次数 2的n次方减1
故:移动次数为:2^n - 1
实现代码如下:
#include<iostream>
using namespace std;
void move(int n,char x,char y,char z)
{
if (1==n) // 如果只有一个盘子的话,直接把盘子从A塔上移动到C塔上
{
cout << x<<"--->"<<z<< endl;
}
else
{
move(n-1,x,z,y); // 把剩下的n-1个盘子,从A盘借助C塔移动到B塔上
cout << x << "--->" << z << endl; // 将第n个盘子从A塔移动到C塔上
move(n-1,y,x,z); // 将n-1个盘子借助A从B塔移动到C上
}
}
int main(void)
{
int n=0;
cout << "请输入要移动的盘子个数:";
cin >> n;
move(n,'A','B','C');
return 0;
}