汉诺塔问题(递归)

  1. 问题描述

有三柱子A,B,C,每一个柱子上都有n个大小不一的盘子,这些盘子大的在下,小的在上,如下图

需要把A柱子上的所有盘子利用B柱子移动到C柱子上,但是每一次只能移动一个盘子并且在移动的过程中需要一直保持大在下。

  1. 输入要求:

输入一个正整数n代表需要移动的盘子数

  1. 输出要求:

输出移动的每一步,例如A->C

  1. 解题思路:

目的是要把A上的所有盘子转移到C上,这样就可以先把A上面的n-1个盘子从A利用C移动到B上,再把最后一个盘子从A直接移动到C上,然后把B上的n-1个盘子利用A移动到C上,图解步骤如下(以n=3演示):

a.把A上面n-1个盘子移动到B上。

b.把A上最后一个盘子直接移动到C上。

c.此时可以把B看出A,A为空柱子可以看出B,而C上的盘子为所有盘子最大的盘子即该盘子已经到了它应该在的位置。

a、c两步可以看成一个问题(c的规模少1),即可以利用递归来解决。

  1. 代码:

#include<iostream>
using namespace std;

//表示把start上的盘子转移到target上经过transfer 
void Hanoi(int n,char start,char transfer,char target){
    //当n只有1时表示只有一个盘子需要移动,直接把start上的盘子移动到target上 
    if(n==1){
        cout<<start<<"->"<<target<<endl;
        return;
    }
    //把start上面的n-1个盘子移动到transf上 
    Hanoi(n-1,start,target,transfer);
    //移走start上面的n-1个盘子后,把最后一个盘子直接移动到target,并输出 
    cout<<start<<"->"<<target<<endl;
    //把transfer上的n-1个盘子移动到target上 
    Hanoi(n-1,transfer,start,target);
    return;
}

int main(){
    int n;
    cin>>n;
    Hanoi(n,'A','B','C');
    return 0;
}

6.运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值