你能挺过第七关吗?汉诺塔练习——python(2.番外篇)

前言

相信大家都曾玩过汉诺塔这个游戏,可是呢,往往就在第六第七个就写不下去了,甚至就在第四第五个,就不知道该怎么办了,下面,我就用python来解决这个问题。

游戏规则

A,B,C三个圆柱,分别为初始位,过渡位,目标位,设A柱为初始位,C位为最终目标位

1. A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘
2. 并且每次移动同一根柱子上都不能出现大盘子在小盘子上
3. 把所有盘的子一个一个按从小到大的顺序移动到柱子C上
4.其每次只能移动一次

代码演示

话不多说,先看源码:

def fn(s, a, b, c):  
    # 基线条件
    if s == 1:
        print(a, '→', c)
    else:
        fn(s-1, a, c, b)
        print(a, '→', c)
    # 递归条件
        fn(s-1, b, a, c)  
fn(3, 'A', 'B', 'C')

主要代码讲解

  • 在第一行代码中
    s为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表目标位圆柱
  • 在第六行代码中
    将初始位的s-1个圆盘移动到过渡位,此时初始位为a,上一级函数的过渡位b即为本级的目标位,上级的目标位c为本级的过渡位
  • 在第九行代码中
    将过渡位的s-1个圆盘移动到目标位,此时初始位为b,上一级函数的目标位c即为本级的目标位,上级的初始位a为本级的过渡

展示效果

  • 如果参数输入3
    A → C
    A → B
    C → B
    A → C
    B → A
    B → C
    A → C
  • 如果参数输入4
    A → B
    A → C
    B → C
    A → B
    C → A
    C → B
    A → B
    A → C
    B → C
    B → A
    C → A
    B → C
    A → B
    A → C
    B → C

……(后面太多,这里就只展示两个, 望谅解)

(转载)思维导图:
在这里插入图片描述

致谢

最后,感谢你们,我才有今天这样的成绩,继续加油💪

在这里插入图片描述

汉诺塔问题是一个经典的问题,源于印度一个古老传说。问题是将一根柱子上的64片黄金圆盘按照大小顺序重新摆放到另一根柱子上,且在任何时候,小圆盘上不能放大圆盘,且一次只能移动一个圆盘。 汉诺塔问题的循环算法可以使用迭代的方式来解决。下面是一个示例代码: ```cpp #include <iostream> #include <stack> #include <string> using namespace std; void hanoiTowerIterative(int N, string from, string to, string help) { stack<int> s1, s2, s3; int moves = (1 << N) - 1; for (int i = N; i > 0; i--) { s1.push(i); } if (N % 2 == 0) { swap(s2, s3); } for (int i = 1; i <= moves; i++) { if (i % 3 == 1) { if (s1.empty() || (!s2.empty() && s2.top() < s1.top())) { cout << "Move " << s2.top() << " from " << to << " to " << from << endl; s1.push(s2.top()); s2.pop(); } else { cout << "Move " << s1.top() << " from " << from << " to " << to << endl; s2.push(s1.top()); s1.pop(); } } else if (i % 3 == 2) { if (s1.empty() || (!s3.empty() && s3.top() < s1.top())) { cout << "Move " << s3.top() << " from " << help << " to " << from << endl; s1.push(s3.top()); s3.pop(); } else { cout << "Move " << s1.top() << " from " << from << " to " << help << endl; s3.push(s1.top()); s1.pop(); } } else { if (s2.empty() || (!s3.empty() && s3.top() < s2.top())) { cout << "Move " << s3.top() << " from " << help << " to " << to << endl; s2.push(s3.top()); s3.pop(); } else { cout << "Move " << s2.top() << " from " << to << " to " << help << endl; s3.push(s2.top()); s2.pop(); } } } } int main() { hanoiTowerIterative(3, "A", "B", "C"); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值