分治算法—汉诺塔问题Java

汉诺塔问题

三根柱子 把A柱子上的盘子全部挪到C上,且每次挪动的时候 小的必须在大的上面

分治算法的思想;

分:把一个大问题拆成若干个小的子问题;

治:求解每个子问题的(递归);

并:把子问题的解合并起来就是大问题的解;

汉诺塔拆分:
我们每次把这些个盘子看成两部分;
- 第一部分:
		最下面的一个大的作为一部分,先把他放在C上;
- 第二部分
		除去最大的剩下的整体作为一部份,再把他放在c上;
### 步骤先把第二部分移动到B上;然后第一部分就可以取出来放到C上;然后再把第二部分移动到C上;

简单来说就是递归:
分三步:①把A上第一部分的n-1个盘子,从A挪到B,C作为中间媒介;
②A上剩下的最后一个盘子直接挪到C上;
③再把B上的n-1个盘子,挪动C上即可
在这里插入图片描述

package 算法.分治算法.汉诺塔问题;
//递归求解子问题
public class HanuoTower {
    // A B C  三根柱子
    public static void main(String[] args) {
            move(3,'A','B','C');
    }
    /**
     * @param num 盘的数目
     * @param a   a、b、c三根柱子
     * @param b   初始时候盘子都在A上 要把全部盘子移动到C上
     * @param c  每次移动的都是:  相应柱子最上面的盘子
     */
    public static void move(int num, char a, char b, char c) {
        //一、如果只有一个盘 则从A—>C
        if (num==1){
            System.out.println(a+"—>"+c);
        }else {
        //二、盘子数目>=2,我们每次把盘子看成2部分,最下面的一个盘 1,和上面剩余的部分num-1
            //此时分三步走
            //1.先把A上面的所有盘子从A—>B 上面所有的盘子数量为num-1;
                //递归把盘子从A—>B  我们需要借助中间盘C盘 所以C放在中间
            move(num-1,a,c,b);
            //2.把最下面的盘子从A—>C
            System.out.println(a+"—>"+c);
            //3.把B上的盘子从B—>C
                //刚才把第一部分的num-1个盘子从A—>B,所以B->C也是num-1个 借助A盘,所以A放中间
            move(num-1,b,a,c);
        }
    }
}

执行结果:

在这里插入图片描述——————————————————————————————————————————

简化后的思想就是
//目的:把a上的盘子挪到c上
public class Main {
    public static void main(String[] args) {
        move(5, 'A', 'B', 'C');
    }
    public static void move(int n, char a, char b, char c) {
        //分两种情况 一只有一个盘子; 二很多盘子
        //一、n==1
        if (n == 1) {
            System.out.println(a + "->" + c);
        } else {
            //二、n>=2  三步走
            //①把上面的n-1个盘子,从a放到b上,c做媒介
            move(n - 1, a, c, b);
            //②把最下面的这个一个盘子从a直接放到c上
            System.out.println(a + "->" + c);
            //③再把b上的n-1个盘子,从b放到c上,a做媒介
            move(n - 1, b, a, c);
        }
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大龄烤红薯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值