汉诺塔问题(C++)

 

汉诺塔问题(C++)_第1张图片

模拟盘子移动过程,以三个盘子为例

汉诺塔问题(C++)_第2张图片

第一次:最小盘到C

中间盘到到B

汉诺塔问题(C++)_第3张图片

最小盘到B

汉诺塔问题(C++)_第4张图片

最大盘到C

汉诺塔问题(C++)_第5张图片

最小盘到A

汉诺塔问题(C++)_第6张图片

中盘到c

汉诺塔问题(C++)_第7张图片

小盘到c

汉诺塔问题(C++)_第8张图片

实现这个算法可以简单分为三个步骤:

(1)     把n-1个盘子由A 移到 B;(C为过渡盘)

(2)     把第n个盘子由 A移到 C;

(3)     把n-1个盘子由B 移到 C;(A为过渡盘)

到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。

代码:

#include "stdafx.h"
#include
using namespace std;

void hannuota(int n,char src,char medium,char dest);
int _tmain(int argc, _TCHAR* argv[])
{
    int m;
    cout<<"请输入盘子数量:";
    cin>>m;
    cout<<"移动"<     hannuota(m,'A','B','C');
    system("pause");
    return 0;
}

void move(char src,char dest)
{
    cout<"< }

void hannuota(int n,char src,char medium,char dest)
{
    if(n==1) //结束点
        move(src,dest);
    else
    {
        hannuota(n-1,src,dest,medium);// 把n-1个盘子由A 移到 B;(C为过渡盘)
        move(src,dest);//把最大盘从A到C
        hannuota(n-1,medium,src,dest);//把n-1个盘子由B 移到 C;(A为过渡盘)
    }
}

运行结果:

汉诺塔问题(C++)_第9张图片

调试:

3个盘子

汉诺塔问题(C++)_第10张图片

以n=2进入递归  hannuota(n-1,src,dest,medium);// 把n-1个盘子由A 移到 B;(C为过渡盘)

 

重新执行函数体,回到函数起始点,继续执行,n!=1跳入else

汉诺塔问题(C++)_第11张图片

以n=1进入递归  hannuota(n-1,src,dest,medium);又回到函数起始位置开始执行

汉诺塔问题(C++)_第12张图片

n==1执行 move(src,dest);//把最大盘从A到C

进入move函数,void不需要返回值,实际是可以返回值的

汉诺塔问题(C++)_第13张图片

n==1,执行完move()到函数末尾,如果不是void会有返回值,回到递归开始的地方

n=2时进入递归,递归完成n返回为2

汉诺塔问题(C++)_第14张图片

下一步move(src,dest);//把最大盘从A到C

然后再以n=1进入递归 hannuota(n-1,medium,src,dest);//把n-1个盘子由B 移到 C;(A为过渡盘)

汉诺塔问题(C++)_第15张图片

执行完毕回到开始调用的地方,第一个n=2的递归全部完成

汉诺塔问题(C++)_第16张图片

再退回n=3

汉诺塔问题(C++)_第17张图片

 

 

 

你可能感兴趣的:(算法,C++)