汉诺塔问题

例   有三根针A,B,C. A针上有n个盘子,盘子大小不等,大的在下,小的在上。如图所示:











要求把这n个盘子从A针移到C针,在移动的过程中可借助B针,每次只能移动一个盘子,切在移动过程中都保持大盘在下,小盘在上。

分析:将n个盘子从A针移到C针,可以分解为下面几个步骤,

(1)将A针上n-1个盘子移到B针上,可借助C针;

(2)将A针上剩下的一个盘子移到C针上;

(3)将n-1个盘子从B针移到C针,可借助A针;

其实,上面的三个步骤包含了两种操作:

1.将多个盘子从一个针移到另一个针上,这是一个递归过程;

2.将一个盘子从一个针移到另一个针上;

用两个函数可以分别实现上面的两种操作,用hanoi函数实现第一种操作,move函数实现第二中操作。

源程序:

#include<iostream>
using namespace std;

void move(char src,char dest) //把src针最上面的一个盘子直接移到dest针上
{
    cout<<src<<"--"<<dest<<endl;
}
void hanoi(int n,char src,char medium,char dest) //把n个盘子从src针上移到dest针上,借助medium针
{
    if(n==1)
        move(src,dest);
    else
    {
        hanoi(n-1,src,dest,medium);       //第一步需要把n-1个盘子从src针上移到medium针上,借助dest针
        move(src,dest);                   //第二步把src针上剩下的一个盘子直接移到dest针上
        hanoi(n-1,medium,src,dest);      //第三步把medium针上的n-1个盘子移到dest针上,借助src针
    }

}
int main()
{
    int m;
    cout<<"Enter the number of diskes: ";
    cin>>m;
    cout<<"the step to moving"<<m<<"diskes: "<<endl;
    hanoi(m,'A','B','C');
    return 0;
}

结果输出:












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值