分治算法(以汉诺塔讲解为例)

何为分治算法?
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。(这里我要说明一点分治算法和二分查找的一个区别,分治算法分解的子问题和原问题是有联系的,即求出子问题的解后,就可得到原文题的解;而二分查找不断的分解,所分解的子模块和整个大模块没有关联,当采用二分查找算法查找序列的关键字时,假设要查找的数小于mid,我们就直接放弃右半部分的序列,接着往左半部分找)

好了,言归正传,我主要写一下汉诺塔的一个思路分析:
(1)如果只有一个盘,毫无疑问A->C
(2)如果有n>=2个盘的情况,我们可以将这些盘看作两个部分,一部分是最底下的一个盘(称作下半部分盘),另一部分是除了底下的那个盘外的上边所有的盘(称作上半部分盘):
1.
先把上半部分的盘A->B
2.
再把下部分的盘A->C
3.
把B塔上所有的上半部分的盘再从B->C

话不多说,直接放代码,

package Algorithm;

//分治算法的典型应用-汉诺塔问题
public class Hanoitower {

	public static void main(String[] args) {
		hanoiTower(5, 'A', 'B', 'C');
		
	}
	//使用分治算法移动汉诺塔
	public static void hanoiTower(int num,char a,char b,char c){
		//只有一个盘,直接从A->C
		if (num == 1) {
			System.out.println("第1个盘从" + a + "->" + c);
		}else {
			//如果有n>=2个盘的情况,我们可以将这些盘看作两个部分,一部分是最底下的一个盘,另一部分是除了底下的那个盘外的上边所有的盘:
			//1,先把上半部分的所有盘从A->B,移动过程借用C塔
			hanoiTower(num-1, a, c, b);
			//2,再把底下的那个盘直接从A->C,相当于只有一个盘时,直接从A->C
			System.out.println("第" + num + "个盘从" + a + "->" + c);
			//3,再把B盘上所有的从A上移到的上半部分所有盘从B->C,移动过程中会借用到A塔
			hanoiTower(num-1, b, a, c);
		}
	}
}

代码不长,注释也很详细,主要是理解汉诺塔的题解思路,再贴一下结果图吧:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值