汉诺塔问题

问题介绍:略

求解方法:

1.递推求解移动次数

   (1),当n=1时,只有一个盘,移一次。

             当n=2时,先将小盘从A桩移到B桩,然后把大盘从A桩移到C桩,最后把小盘从B桩移到C桩,移3次完成。

             设移动n个盘的汉诺塔需要g(n)次完成,则分3个步骤:

             1)将n个盘上面的n-1个盘借助C桩从A桩移到B桩,需g(n-1)次;

              2)将A桩上第n个盘子移到C桩上(1次);

             3)将B桩上的n-1个盘子借助A桩移到C桩上,需g(n-1)次。

因而有递推关系:g(n) = 2*g(n-1)+1

初始条件:g(1) = 1


源代码:

#include<iostream.h>
void main()
{
    double m = 1;//确定初始条件
    int i , n;
    cout<<"请输入盘片数n: ";
    cin>>n;
    for( i = 2; i <= n; i++)
    {
        m = m*2 + 1;//在循环中实施递推
    }
    cout<<"移动次数为: "<<m<<endl;
}

2.递归求解移动过程

设递归函数hanoi(n, a, b, c)展示把n个盘从A桩借助B桩移到C桩的过程,函数move(a, c)输出从a桩到c桩的过程。

当n=1时, 即move(a, c)。

当n > 1 时,分3步:

1)将A桩上面的n-1个盘子借助C桩移到B桩上,即hanoi(n-1, a, c , b).

2)将A桩上第n 个盘子移到C桩上,即move(a, c).

3)将B桩上的n-1个盘子借助A桩移到C桩上,即hanoi(n-1, b, a, c).


源代码:

#include<iostream.h>
int k = 0; 
void move(char x, char y)//输出函数
{
    cout<<x<<"-->"<<y<<"  ";
    k++;                //统计移动次数
    if(k%5 == 0)
    {
        cout<<"\n";
    }
}
void hanoi(int m, char a, char b, char c)//递归函数
{
    if(m == 1)
        move(a,c);
    else
    {
        hanoi(m-1,a,c,b);
        move(a,c);
        hanoi(m-1,b,a,c);
    }
}
void main()
{
    int n;
    cout<<"请输入n的值:";
    cin>>n;
    hanoi(n,'A','B','C');
    cout<<k<<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值