递归解决 Tower of Hanoi 问题

   原创: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;
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/wangkemingshishuaige/article/details/51172053
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞