何为分治算法?
分治算法的基本思想是将一个规模为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);
}
}
}
代码不长,注释也很详细,主要是理解汉诺塔的题解思路,再贴一下结果图吧: