经典算法大全之河内之塔

背景说明

河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的
胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒
(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一
根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之
时,此塔将毁损,而也就是世界末日来临之时。

问题描述

有三个柱子ABC,将A柱子上的盘子N(上到下,盘子由小到大),通过B柱子辅助,全部转移到C柱子,移动过程中,要求大盘子不能在小盘子上面,这个又叫汉诺塔。

解法

如果只有一个盘子时,将它直接搬到C,当有两个盘子,就将B做为辅助。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是A->B A->C B->C这三个步骤,而被遮住的部分是一个递归处理。如果有n个盘子,则移动完毕所需的次数为2^n-1。

public class 海内之塔 {

	/**
	 * 2014-11-20 下午10:37:33
	 */
	public static void main(String[] args) {
		int n;
		System.out.println("请输入盘子的个数N:");
		Scanner input = new Scanner(System.in);
		n=input.nextInt();
		hanoi(n, 'A', 'B', 'C');
		input.close();
	}
	/**
	 * 第一个参数代表所有盘子的初始所在位置,第二个参数起辅助作用,第三个参数代表盘子最终位置
	 * 2014-11-20 下午11:16:23
	 */
	public static void hanoi(int n,char A, char B, char C){//
		if(n==1){
			System.out.println("将第"+n+"个盘子"+A+"->"+C);
		}else{
			//第一步:将n-1个盘子移动到B
			hanoi(n-1, A, C, B);
			//第二步:将第n个移动到C
			System.out.println("将第"+n+"个盘子"+A+"->"+C);
			//第三步:此时n-1个盘子全部在B上,将A与B的作用互换,
			//即将A当作辅助,将B上的盘子n-1个全部移动C,重复以上步骤
			hanoi(n-1, B, A, C);
		}
	}

}

算法分三个步骤:

第一,把A上的n-1个盘通过C移动到B。

第二,把A上的最下面的盘移到C。

第三,因为n-1个盘全在B上了,所以把B当做A(A、B位置互换)重复以上步骤就好了


你可能感兴趣的:(算法)