美文网首页算法
汉诺塔问题

汉诺塔问题

作者: Timmy_zzh | 来源:发表于2021-08-13 19:25 被阅读0次
1.题目描述
  • 在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制:
(1) 每次只能移动一个盘子;
(2) 盘子只能从柱子顶端滑出移到下一根柱子;
(3) 盘子只能叠在比它大的盘子上。
请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。
你需要原地修改栈。

示例1:
 输入:A = [2, 1, 0], B = [], C = []
 输出:C = [2, 1, 0]
 
示例2:
 输入:A = [1, 0], B = [], C = []
 输出:C = [1, 0]
 
提示:
A中盘子的数目不大于14个。
2.解题思路:
  • 递归解法
    • 将A柱子上的n个盘子,分成两部分,上面部分为n-1个,还有最底部的一个大的
    • 先将n-1个盘子看作一个整体从A柱子移动到B柱子上(借助C柱子)
    • 然后将第n个盘子从柱子A移动到C柱子上
    • 最后将B柱上的n-1个盘子移动到柱子C上
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        movePlate(A.size(), A, B, C);
    }

    private void movePlate(int size, List<Integer> start, List<Integer> auxiliary, List<Integer> target) {
        if (size == 1) {
            target.add(start.remove(start.size() - 1));
            return;
        }
        movePlate(size - 1, start, target, auxiliary);
        target.add(start.remove(start.size() - 1));
        movePlate(size - 1, auxiliary, start, target);
    }
3.总结
  • 递归算法总结
  • 递归三要素:
    • 入参于返回值
    • 终止条件
    • 单层递归逻辑处理

相关文章

  • 汉诺塔问题与递归

    文章也同时在个人博客 http://kimihe.com/更新 汉诺塔问题(Hanoi Tower) 汉诺塔问题的...

  • 汉诺塔算法和背后的数据结构

    汉诺塔是有算法的。 很多问题都有解决办法,汉诺塔也不例外。如果汉诺塔的算法符合 Introduction to a...

  • Python使用递归解决汉诺塔问题

    汉诺塔 (http://baike.baidu.com/view/191666.htm) , 汉诺塔问题也是程序设...

  • 动态规划刷题整理(持续更新)

    (持续更新) 奇怪的汉诺塔(4柱汉诺塔) 描述汉诺塔问题,条件如下:1、这里有A、B、C和D四座塔。2、这里有n个...

  • Python汉诺塔递归算法

    汉诺塔含义: 汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石...

  • 图解汉诺塔问题( Java 递归实现)

    汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题——汉诺塔问题。 先看下百度百科是怎么定义汉诺塔的规...

  • 汉诺塔问题

  • 汉诺塔问题

    问题 有三个塔a、b、ca塔上有盘子若干,大小不等,小盘在上,大盘在下,每次只移动一个盘子,现需要将a塔上的全部盘...

  • 汉诺塔问题

  • 汉诺塔问题

    题目(算法课第八课) 古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上...

网友评论

    本文标题:汉诺塔问题

    本文链接:https://www.haomeiwen.com/subject/qfsjbltx.html