2.汉诺塔移动

                     💀🤭内卷起来🤭💀

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LiP6YGN5LiJ5Y2B5YWt5bK4,size_15,color_FFFFFF,t_70,g_se,x_16

         😂也不知道xdm喜不喜欢二次元😂

介绍:
古代有一个梵塔,塔内有三个柱A、B、CA、B、C,AA柱上有6464个盘子,盘子大小不等,大的在下,小的在上。有一个和尚想把这6464个盘子从AA柱移到BB柱,但每次只能允许移动一个盘子,并且在移动过程中,33个柱上的盘子始终保持大盘在下,小盘在上。在移动过程中可以借助CC柱。

思路:

假设现在A柱子上只有一个盘子,此时无需B柱子中转就可直接将盘子从A移动到C柱子上。

假设现在A柱子上有22个盘子,此时需将小盘子放到B柱子上,然后把大盘子放到C柱子上,最后将小盘子移动到C柱子上。(我们可以借助B将22个盘子移动到C柱子上,也可以借助C柱子将22个盘子从A移到B。)

假设A上面有33个盘子,可以根据移动22个盘子的过程,先借助C将A上的两个盘子移动到B,再将A上的大盘子移动到C,最后再讲B上的22个盘子移动到C…

以此类推,A柱子上有nn个盘子,可以将n-1n−1个盘子看作一个整体,即递归中的子问题。借助C柱子将A上的n-1n−1个盘子移动到B,再将A上的大盘子移动到C,然后借助A,将B上的n-2n−2和盘子移动到A上,将B上的大盘子移动到C上…如此往复。

由上所述,可定义一个递归函数 hanoi(n, A, B, C) ,边界条件为 n=1n=1,递归公式为 hanoi(n - 1, A, C, B)hanoi(n - 1, B, A, C)

假设:(每次只能移动与1个盘子)
只有一个盘子直接从a到c

只有两个盘子a到b,a到c,b到c

......

#include <iostream>
using namespace std;
void move(char src,char dest)//移动
{
 cout<<src<<"-->"<<dest<<endl;  
}

void hanoi(int n, char src, char medium, char dest)//过程
{
    if(n==1)
        move(src,dest);
    else{
        hanoi(n-1,src,dest,medium);
        move(src,dest);
        hanoi(n-1,medium,src,dest);
        }
}

int main(){    
    int m;
    cin>>m;//输入几个盘子
    hanoi(m,'A','B','C');    
    return 0;
}

小伙伴们试着运行查看一下结果

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LiP6YGN5LiJ5Y2B5YWt5bK4,size_19,color_FFFFFF,t_70,g_se,x_16

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值