java学习笔记(数据结构与算法13)分治算法解决汉诺塔问题。

目录

分治算法:

汉诺塔问题: 

思路: 

代码: 

结果:


分治算法:

分治算法的基本思想:

将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。

分治算法解题的一般步骤:

(1)分解,将要解决的问题划分成若干规模较小的同类问题;

(2)求解,当子问题划分得足够小时,用较简单的方法解决;

(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

汉诺塔问题: 

将A塔的所有圆盘移动到C塔。

规定

1) 小圆盘上不能放大圆盘

2)在三根柱子之间一次只能移动一个圆盘

 

思路: 

分析发现,我们将n个盘从a移动到c,

需要:

(1)先将n-1个盘从a移动到b,

(2)再将最下面的盘从a移动到c

(3)将b上的n-1个盘从b移动到c

这样,就符合了分治算法的思想,

步骤(1)是一个n变小的原问题,可以理解为分,而步骤(3)是将分得到的结果归并起来,可以理解为治。

而步骤(1)和(3)都可以通过递归实现。

代码: 

package FenZhi;

public class HanNuoTa {
    public static void main(String[] args) {
        solution(3,'A','B','C');
    }
    public static void solution(int Num,char a,char b,char c){
        if(Num==1){
            System.out.println("第1个盘从"+a+"移动到"+c);
        }else{
            solution(Num-1,a,c,b);
            System.out.println("第"+Num+"个盘从"+a+"移动到"+c);
            solution(Num-1,b,a,c);
        }
    }
}

结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值