基本介绍
“分而治之”,就是把一个复杂问题分成两个或更多相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
基本步骤
1、分解:将原问题分解为若干规模较小,相互独立,与原问题形式相同的子问题
2、解决:若子问题规模较小而容易被解决则直接解决,否则递归地解各个子问题
3、合并:将各个子问题的解合并为原问题的解
利用分治算法实现汉诺塔问题
public class DivideAndConquare {
public static void main(String[] args) {
int num=5;
hanoitower(num,'A','B','C');
}
//分治算法解决汉诺塔问题
/**
*
* @param num 共有多少个盘子 A B C为柱子
* @param A
* @param B
* @param C
*/
public static void hanoitower(int num,char A,char B,char C){
if(num==1){
//如果只有一个盘子,则直接从A->C
System.out.println("第1个盘子从"+A+" -> "+C);
}else{
//盘子数大于1
//将其分成两个部分 (1)最下面的盘子 (2)除了最下面的盘子之外的所有盘子
//将上面的部分从A->B ,移动过程会使用到C
hanoitower(num-1,A,C,B);
//将最下面的移动到C
System.out.println("第"+num+"个盘子从"+A+" -> "+C);
//再将上面的部分从B->C
hanoitower(num-1,B,A,C);
}
}
}