欢迎使用CSDN-markdown编辑器

汉诺塔算法

问题来源:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
示例参考图
三个圆盘的汉诺图
四个圆盘的汉诺图
简单举例
1、当n=1时,直接把圆盘放到目的柱子上。
2、当n=2时
需要3步
3、当n=3时
需要7步

可以看出f(1)=1,f(2)=3,f(3)=7……f(n)=2*f(n-1)+1 ;
解决思路
1、把n-1个圆盘从起点盘移动到没有任何圆盘的过渡盘;
2、把最后一个圆盘从起点移动到目标盘;
3、把n-1个圆盘从过渡盘移动到目标盘(参考1和2的操作来实现);
这就变成了递归问题!扩展到n,需要的操作次数为f(n)=2*f(n-1)+1
C++代码实现
其中A为初始盘,C为目标盘,输入需要从A->C的圆盘个数n

#include <iostream>
using namespace std;
void move(char x,char y);
void hannuota(int n,char m,char q, char p);
int sum=0;
int main(){
    int n;
    cout<<"请输入汉诺塔:n"<<endl;
    cin>>n;
    hannuota(n,'A','B','C');
    cout<<"需要移动的次数:"<<sum;
    cin.get();              //为了在输出窗口看到最终结果,所以调用了两次cin.get()
    cin.get();           
    return 0;
}
void move(char x,char y){
    sum++;
    cout<<x<<"->"<<y<<endl; //在窗口显示移动的过程:x->y
}
void hannuota(int n, char m,char q,char p){
    if(n==1)
        move(m,p);         //递归结束条件,将最后一个盘从m移动到目标盘p
    else
    {
    hannuota(n-1,m,p,q);   // 把n-1个圆环从起点盘m移动到(当前)没有任何圆环的过渡盘q
    move(m,p);             // 把最大的圆盘从起点起点盘m移动到目标盘p
    hannuota(n-1,q,m,p);   // 把n-1个圆环从过渡盘q移动到目标盘p
    }
}

测试
输入n=4:
输出:
n=4

其他测试类似,均能输出正确结果,实验成功!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值