递归值汉诺塔

来源:互联网 发布:百度云加速软件 编辑:程序博客网 时间:2024/06/07 23:10

算法思想:

        汉诺塔有三个塔座,假设为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;        }