汉诺塔

汉诺塔问题

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

图片来自网络,侵删
在这里插入图片描述

解决方法

ps: n: A->(B)->C 代表n个盘从A借助B到C
在这里插入图片描述

代码实现

  • Python
# n为A柱子上的盘数
no = 0  # 统计每一步


def move(n, a, b, c):
    count = 0  # 统计总次数
    global no  # 每一步的编号
    if n == 1:
        no = no + 1        
        print(no, ":", a, "-->", c)
        return 1
    else:
        count += move(n - 1, a, c, b)
        count += move(1, a, b, c)
        count += move(n - 1, b, a, c)
        return count


print(move(3, "A", "B", "C"))
  • Java
public class Hanoi {
    static int count = 0;

    public static void main(String[] args) {
        // hanoi(3, 'A', 'B', 'C');
        hanoi(6, 'A', 'B', 'C');
        System.out.println(count);
    }

    public static void hanoi(int n, char a, char b, char c) {
        if (n == 0) {
            // return;
        } else {
            hanoi(n - 1, a, c, b);
            System.out.println(a + "->" + b);
            count++;
            hanoi(n - 1, c, b, a);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值