• 递归-汉罗塔及其变种


    0x00 原生汉罗塔

    汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

    分析

    思路:

            A上的N-1个盘借助C移动到B

            A最底下那个盘移动到C

            B上的N-1个盘子借助A移动到C

    1. #include <iostream>
    2. #include<vector>
    3. #include<algorithm>
    4. using namespace std;
    5. void move(char A, char B) {
    6. cout << A << "->" << B << endl;
    7. }
    8. void hanoi(int n, char a, char b, char c)
    9. {
    10. if (n == 1)
    11. {
    12. move(a, c);
    13. }
    14. else
    15. {
    16. hanoi(n - 1, a, c, b);//将A座上的n-1个盘子借助C座移向B座
    17. move(a, c);//将A座上最后一个盘子移向C座
    18. hanoi(n - 1, b, a, c);//将B座上的n-1个盘子借助A座移向C座
    19. }
    20. }
    21. int main() {
    22. int n = 0;
    23. cin >> n;
    24. hanoi(n,'A','B','C');
    25. return 0;
    26. }

    0x01 变种汉罗塔

            相较于原始汉罗塔,现在我们改变这个游戏的玩法:不允许直接从最左(右)边移动到最右()边(每次移动一定是移到中间杆或从中间杆移出),也不允许大圆盘放到小圆盘的上面。Daisy 已经做过原来的汉诺塔问题和汉诺塔I问题,但碰到这个问题时,她想了很久都无法解决。请你帮助她。现在有 N个圆盘,和A、B、C三根柱子,她至少需要多少次移动才能把这些圆盘从最左边移到最右边,并且打印出移动的路径。

    分析:

            由于不能直接由A到C,因此:

            A上的N-1先借助B到C。(需要F(n-1)次移动)

            A最底下的到B。          (需要1次移动)

            C上的N-1借助B到A。(需要F(n-1)次移动)

            B最底下的到C。        (需要1次移动)

            A的N-1借助B到C。(需要F(n-1)次移动)

    因此F(n)=3F(n-1)+2。

    只统计次数

    1. long long hani(int n) {
    2. if (n == 1) {
    3. return 2;
    4. }
    5. else {
    6. return 3 * hani(n - 1) + 2;
    7. }
    8. }

    打印路径 

    1. #include <iostream>
    2. #include<vector>
    3. #include<algorithm>
    4. using namespace std;
    5. void move(char A, char B) {
    6. cout << A << "->" << B << endl;
    7. }
    8. void hani(int n,char a,char b,char c) {
    9. if (n == 1) {
    10. move(a,b);
    11. move(b, c);
    12. }
    13. else {
    14. hani(n - 1,a,b,c);
    15. move(a,b);
    16. hani(n - 1,c,b,a);
    17. move(b, c);
    18. hani(n - 1,a,b,c);
    19. }
    20. }
    21. int main() {
    22. int n = 0;
    23. cin >> n;
    24. hani(n,'A','B','C');
    25. return 0;
    26. }

  • 相关阅读:
    Ubuntu安装步骤
    正则系列之手机号码正则
    vue 克隆代码块
    shopee知虾数据:提升Shopee店铺运营效果必备工具—知虾数据工具
    excel英文自动翻译成中文教程
    力扣刷题之二叉树专栏
    95后大厂程序员删库被判刑,只因项目被接手对领导心生不满
    蓝色背景—旅游
    攻防世界题目练习——Web引导模式(二)
    frida学习
  • 原文地址:https://blog.csdn.net/hacker_zrq/article/details/132925766