傻瓜级别汉诺塔理解--参考 左神

博客围绕Java和LeetCode算法展开,虽无具体内容,但可知涉及Java语言在LeetCode算法题中的应用,能帮助开发者提升算法能力和编程技巧。

想法都写在注释里面啦~~ 就不画图了

import java.util.*;

// 主要 考虑的 是 每步  n - 1 怎么走 ? 
//  1 层 怎么走 ? 

public class Solution {
    private static ArrayList<String> list = new ArrayList<>();
    public ArrayList<String> getSolution(int n) {
        // write code here
        // 逐步分解子问题 知道 一个该咋走吧 作为 递归终结者。
        //整体从左到右 就写从左到右
        leftToRight(n);
        return list;
    }
    private void leftToRight(int n) {
        if (n == 1) {
            list.add("move from left to right");
            return;
        }
        // 剩下 n - 1 个 小的压大的 给 n == 1 让路  
        // 怎么 走 ? 走法 一样 先让最后一个走 剩下的让路
        leftTomid (n - 1);
        // 走到中间了 送走底层去他相应的位置  好 怎么去下一个位置 mid to right 让 n - 1 去下一个位置
        list.add("move from left to right");
        midToRight(n - 1);
    }

    private void leftTomid(int n) {
        if (n == 1) {
            list.add("move from left to mid");
            return;
        }
        // 也是 让路 原则  n - 1 去哪 ? 去右边 刚开始 是 n 每个柱子上都没有 盘子
        leftToRight( n - 1);
        list.add("move from left to mid");
        rightTomid(n - 1);
    }

    private void rightToLeft(int n) {
        if (n == 1) {
            list.add("move from right to left");
            return;
        }
        rightTomid(n - 1);
        list.add("move from right to left");
        midToleft(n - 1);
    }

    private void  rightTomid(int n) {
        if ( n == 1) {
            list.add("move from right to mid");
            return;
        }
        // 怎么去 让路
        rightToLeft(n-1);
        // 再来
        list.add("move from right to mid");
        leftTomid(n-1);
    }

    private void midToRight( int n ) {
        if (n == 1) {
            list.add("move from mid to right");
            return;
        }
        // 和上面 一样 剩余的让路
        midToleft( n - 1);
        list.add("move from mid to right");
        leftToRight( n - 1);
    }

    private void midToleft(int n) {
        if ( n == 1) {
            list.add("move from mid to left");
            return;
        }
        // 怎么去 让路 
        midToRight( n - 1);
        list.add("move from mid to left");
        rightToLeft(n - 1);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值