汉诺塔问题

题目链接

汉诺塔问题

题目描述

注意点

  • 原地修改栈
  • A中盘子的数目不大于14个

解答思路

  • 递归解决本题,初始先将list1中n - 1个盘子全部移动到list2中(期间会借用list3),然后将1中最后一个盘子移动到list3中,再将list2中n - 1个盘子移动到list1(期间会借用list3),再将list2中最后一个盘子移动到3中,以此类推...

代码

java 复制代码
class Solution {
    public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) {
        recursion(A, B, C, A.size());
    }

    public void recursion(List<Integer> list1, List<Integer> list2, List<Integer> list3, int n) {
        // 1已经全部移动
        if (n <= 0) {
            return;
        }
        // 将1中n - 1个盘子移动至2
        recursion(list1, list3, list2, n - 1);
        // 将1中最后一个盘子移动至3
        list3.add(list1.remove(list1.size() - 1));
        // 将2中的n - 1个盘子移动至3
        recursion(list2, list1, list3, n - 1);
    }
}

关键点

  • 移动汉诺塔的规律:f(A, B, C, n) = f(A, C, B, n - 1) + f(A, B, C, 1) + f(B, A, C, n - 1)
  • 注意递归的过程中每次传入参数中的list都有变化
相关推荐
知秋正在996几秒前
Java实现Html保存为.mhtml文件
java·开发语言·html
ホロHoro几秒前
数据结构非线性部分(二)review
linux·服务器·数据结构
码头整点薯条3 分钟前
大数据量查询处理方案
java
菜鸟233号6 分钟前
力扣474 一和零 java实现
java·数据结构·算法·leetcode·动态规划
xlp666hub6 分钟前
链表与它在 Linux 内核中的实现
linux·数据结构
天天摸鱼的java工程师9 分钟前
工作中七天免登录如何实现
java·后端
CoovallyAIHub10 分钟前
2026 CES 如何用“视觉”改变生活?机器的“视觉大脑”被点亮
深度学习·算法·计算机视觉
小杨同学4910 分钟前
C 语言实战:水果总价计算程序(结构体应用 + 细节优化)
后端·算法·程序员
q***441510 分钟前
Java性能优化实战技术文章大纲Java性能优化的核心目标与原则
java·开发语言·性能优化
毕设源码-郭学长14 分钟前
【开题答辩全过程】以 基于springbootvue图书馆选座系统设计与实现为例,包含答辩的问题和答案
java