目录
分治算法:
分治算法的基本思想:
将一个规模为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);
}
}
}
结果: