原创:http://blog.csdn.net/kkkkkxiaofei/article/details/8333644
自己感觉写的没有原博主的那么容易理解,于是就站在巨人的肩膀上摘苹果,感谢博客主。
算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样(只是事件的复杂程度不一样)。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
// 第一个是初始塔 第二个是转移塔 第三个是目的塔,
int i=1;
void Move(int n,char from,char to)
{
printf("第%2d步:将%d号盘子从%c移至%c\n",i++,n,from,to);
}
void hanoi(int n,char from,char depend_on,char to)
{
if(n==1)
Move(n,from,to);// 最后一个盘子,就直接从初始塔移到目的塔
else
{
hanoi(n-1,from,to,depend_on);// 借助目的塔将前n-1个盘子从初始塔移至转移塔。
Move(n-1,from,to);
hanoi(n-1,depend_on,from,to);// 借助初始塔将转移塔上的n-1个盘子移至目的塔。
}
// 仔细想一下 就能 感受到递归的强大。
}
int main()
{
int n=3;
char x='a',y='b',z='c';
hanoi(n,x,y,z);
return 0;
}