Hanio Tower

 先上图,看图比较容易理解:

idea:

 如果想要把x柱上面的n个盘子移到y柱上,

  1.  我们需要先把x柱子上的n-1个盘子先整体移到z柱暂存;

  2.  然后第n个盘子从x柱移到y柱上;
  3.  最后将z柱上的n-1个盘子移到y柱上。

我们在把第1个过程进行拆分:

 1.1  将x柱子上的n-2 个盘从移到y柱上暂存。

 1.2  然后第n-1个盘子从x柱移到z柱上;

 1.3  最后将y柱上的n-2个盘子移到z柱上

我们在把第3个过程进行拆分:

 3.1  将z柱子上的n-2 个盘从移到x柱上暂存。

 3.2  然后第n-1个盘子从z柱移到y柱上;

 3.3  最后将x柱上的n-2个盘子移到y柱上

....

可以继续对1.1  1.3  3.1  3.3这四个过程安装上面的方法拆分,这里就不给出了;

慢慢地我们就可以发现规律,移动n个盘子的过程中肯定包含了移动n-1个盘子的过程;(典型的递归问题)

我们现在已经知道了这个过程的规律,那么就要考虑边界问题了:

当需要移动的盘子数量不为零,我们就不能停,那当盘子数量为0时,就可以停止

....

现在,我们来用代码来实现一下(C++)

#include <stdio.h>
#include <iostream>
using namespace std;

void move (int n,char A,char B)
{
    cout<<"move "<<n<<"  from  "<<A<<" to  "<<B<<endl;
}

void hanio(int n, char x, char y, char z) // 这个函数的执行目的: 将n个盘子从x柱移到y柱。z是用来中转的
{
    if(n){
        hanio(n - 1, x, z, y);  // ① 我们需要先把x柱子上的n-1个盘子先整体移到z柱暂存;
        move(n, x, y);          // ② 然后第n个盘子从x柱移到y柱上
        hanio(n - 1, z, y, x);   // ③ 最后将z柱上的n-1个盘子移到y柱上。
    }
}
int main()
{
    hanio(5,'A','B','C');
}

运行结果

 

发布了41 篇原创文章 · 获赞 35 · 访问量 4334

猜你喜欢

转载自blog.csdn.net/weixin_38140931/article/details/102487795