本文以漢諾塔遊戲爲例
一、介紹
分治法是一種很重要的算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效算法的基礎,如排序算法(快速排序,歸併排序),傅立葉變換(快速傅立葉變換)……
分治算法可以求解的一些經典問題
- 二分搜索
- 大整數乘法
- 棋盤覆蓋
- 合併排序
- 快速排序
- 線性時間選擇
- 最接近點對問題
- 循環賽日程表
- 漢諾塔
二、基本步驟
- 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題
- 解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題
- 合併:將各個子問題的解合併爲原問題的解。
三、舉例【漢諾塔】
漢諾塔介紹
漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
代碼
public class Hanoitower {
public static void main(String[] args) {
hanoiTower(5,'A','B','C');
}
/**
* @param num 有幾個盤
* @param a
* @param b
* @param c
*/
public static void hanoiTower(int num,char a,char b,char c){
//若只有一個盤
if(num == 1){
System.out.println(a+ " --> " + c);
}else{
//總是看作兩個盤,最下邊的一個盤和上面的所有盤
//1.把最上面的所有盤 a -> b,移動過程中使用到c
hanoiTower(num - 1,a,c,b);
//2.把最下面的盤a -> c
System.out.println(a +" --> "+ c);
//3.把b塔的所有盤 從b->c 移動過程用a塔
hanoiTower(num - 1,b,a,c);
}
}
}