zoukankan      html  css  js  c++  java
  • c++汉诺塔相关知识总结1

    困扰已久,难以攻克的汉诺塔总结来啦

    Part One 汉诺塔到底是什么呢?

    汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。                        --引用维基百科

    也就是说把圆盘从一个柱子,移动到另一个柱子,中途需要一个柱子来辅助完成,并且在这个过程中必须遵循“下大上小”的原则。

    Part Two常见问题一:打印汉诺塔移动的步骤


    那么这一类题应该怎么办呢?



    接下来详解代码

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<cstring>
    using namespace std;
    int n,flag;
    void move(int x,char A,char B,char C){//x就是代表这是从下往上数(从大往小)第x个圆盘
        if(x==0)
            return;
    //接下来开始想象你的面前有ABC,3个圆柱 其中第一个圆柱上放着x个圆盘,你想要把他们从第一个圆柱挪到第三个圆柱上 move(x
    -1,A,C,B);//递归,这一句的意思相当于就是把当前圆盘上面的 x-1 这么一堆较小的圆盘 ,把他们从A挪到B(借助C柱) printf("%c->%c ",A,C);//然后把它从A挪到C move(x-1,B,A,C);//现在A柱就空出来了,再把原来B上面x-1个圆盘挪到C(借助A)
    //那么这样子,x个圆盘就都挪到C啦@@@
    //有的时候看着这一堆ABC会发蒙
    //别慌,把每一次“集体大挪动”都看成是从A挪到C,和第一次x=n是=时的初衷一样;只需要在递归的过程中把ABC分别代表的柱子的字母记录下来,在递归过程中打印即可
    }
    int main() { cin>>n; move(n,'A','B','C'); return 0; }

    哈哈,其实它也不难!

     

  • 相关阅读:
    决定你人生高度的,不是你的才能,而是你的态度
    享受六一的最后几分钟
    DB9 公头母头引脚定义及连接
    bzoj3207--Hash+主席树
    bzoj1901 [ Zju2112 ] --树状数组套主席树
    bzoj1723 [ Usaco2009 Feb ] --前缀和(水题)
    bzoj3932 [ CQOI2015 ] --可持久化线段树
    bzoj3037--贪心
    bzoj3388 [ Usaco2004 Dec ] (神奇的解法)
    bzoj2693--莫比乌斯反演+积性函数线性筛
  • 原文地址:https://www.cnblogs.com/Tidoblogs/p/11105040.html
Copyright © 2011-2022 走看看