zoukankan      html  css  js  c++  java
  • 每天算法一丁点(1)--汉诺塔堆盘子

    愚笨的我开始慢慢的学习算法之路。  既然开始的太晚,又不像大佬那般勤奋

    索性每天就一点点,进步一点点也是好的呀

     

    翻开了递归,求n阶倒是很快写完了,接下来便是汉诺塔堆盘子。。。

    遇到这个问题就像小学时遇到 鸡兔同笼。似懂非懂。三个四个盘子还是数得过来的,直接要堆64个。。

    这啥呀!直接摔书!         

    根据书上的解释,用递归可以妥妥的解决这个问题。(《算法设计与实现》)

    开始有64个盘子吭!3根柱子A、B、C。 要把摞好的64个盘子全部从A转移到C,并且中途只能小盘子压大盘子。 (直接一记嚎呦根)

    老和尚要开始了,但是老和尚真的6:

    1. 他想让第二个和尚把63个盘子移到柱B,然后自己把剩下的一个盘子移到柱C上,最后再第二个和尚把63个盘子移到柱C。

    2. 第二个和尚也学习老和尚,让小和尚把62个盘子移到柱C,自己把一个盘子移到柱B,最后让小和尚把62个盘子移到柱B。。

    3. 就这样一层层向下,赤裸裸压榨啊有木有!

    不得不说这是个好方法,教会了我们要争做老和尚!

    假设只有3个盘子,和尚们也这样划分任务。那第三个和尚只需移动一个盘子,不需要划分任务了。

    这就是边界值,停止递归的条件。(最后一个和尚只需移动一个盘子)

    综上所述,把n个盘子从柱A移动到柱C:

    1. 把柱A上(n-1)个盘子移动到柱B
    2. 把柱A上的第n个盘子移动到柱C
    3. 把柱B上(n-1)个盘子移动到柱C

    接下来上代码了:

    #include <iostream>
    using namespace std;
    
    //分析:    把柱A上(n-1)个盘子利用柱C从A放到柱B; (n-1) A -> B
    //         把柱A的一个盘子放到柱C;               1    A -> c
    //         把柱B的(n-1)个盘子利用柱A从B放到柱C; (n-1) B -> C
    
    void move(int n,char a,char b){
        printf("将第%d个盘子从%c运到%c
    ",n,a,b);
    }
    int hanoi(int n,char a,char b, char c){
        if(n==1){
            move(1,a,c);
        }
        else{
            hanoi(n-1,a,c,b);
            move(n,a,c);
            hanoi(n-1,b,a,c);
        }
        return 0;
    }
    int main(){
        int num;
        while(scanf("%d",&num)!=EOF){
            hanoi(num,'A','B','C');
        }
        return 0;
    }

    呜呜呜。。。少时不努力,老大不会打代码。。

  • 相关阅读:
    方向-Vocabulary
    常见问题之Zego+Audio原生播放音频冲突
    synchronized类锁,方法锁,块级锁,一文看懂
    vim复制粘贴
    FastDFS文件服务器安装指南附安装包和自启动(看此篇就够了)
    springboot后端校验
    springboot打包启动时报mybatis的typeAlias类名找不到的错误
    给springboot增加XSS跨站脚本攻击防护功能
    docker cannot open directory .: Permission denied无权限问题
    docker学习笔记一篇就通系列(持续更新)
  • 原文地址:https://www.cnblogs.com/yinniora/p/12103685.html
Copyright © 2011-2022 走看看