程序员必须会的基本算法3-分治算法(以经典的汉诺塔问题为例)

package basic;

public class DivideConquer
{
	/*
	 * 分治算法就是分而治之,就是把一个复杂的问题分成很多的相同或者相似的子问题,
	 * 然后再将子问题分解成更小的子问题...一直到最后的子问题可以简单地直接解决
	 * 原问题地解就是子问题的解的合并
	 * 
	 * 分治算法的应用:
	 * 最经典的汉诺塔问题,归并排序,快速排序,傅里叶变换,循环赛日程表,最接近点问题
	 * 线性时间选择,棋盘覆盖,大整数乘法,二分搜索等等
	 * 
	 * 分治算法有三步:
	 * 1.分解:将母问题分解成若干个规模小,互相独立,和母问题相似的子问题
	 * 2.求解:将母问题分解成可以简单求解的子问题后求解
	 * 3.合并:将子问题的求解进行合并得到答案
	 * 
	 * 下面以汉诺塔为例,先聊一下汉诺塔传说:
	 * 汉诺塔问题源于印度一个古老传说的益智的玩具,大梵天创造了世界的时候做了三根金刚石柱子,
	 * 在第一根柱子上从下往上按照大小的顺序擂着64片黄金圆盘.大梵天命令婆罗门把圆盘按照大小
	 * 顺序重新移动摆放到另外一根柱子上,并且在小圆盘上面不能放大圆盘,
	 * 三根柱子之间一次只能移动一个盘
	 * 思路:
	 * 三根柱子分别是A,B,C
	 * 虽然要移动64个盘,但是我们可以简化,
	 * 一个盘:直接从A到C
	 * 两个盘:上面的先到B,然后下面的A到C,然后B到C
	 * 三个盘:上面的两个先到B,然后最下面那个A到C,然后B的两个到C
	 */
	public static void Hannotower(int count,char a,char b,char c)
	{
		if(count==1)
		{
			System.out.println("第"+count+"个盘从"+a+"-->"+c);
		}
		else
		{
			Hannotower(count-1, a, c, b);
			System.out.println("第"+count+"个盘从"+a+"-->"+c);
			Hannotower(count-1, b, a, c);
		}
	}
	public static void main(String[] args)
	{
		Hannotower(20, 'a', 'b', 'c');
	}
}

发布了133 篇原创文章 · 获赞 37 · 访问量 4727

猜你喜欢

转载自blog.csdn.net/qq_43416157/article/details/104444016