仅需要几行代码就可以解决的汉诺塔算法设计与分析

汉诺塔 [ 1 ] ^{[1]} [1](又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

汉诺塔问题在算法设计与分析中被当作经典的递规类问题求解。使用递规法只需要三步需要三步即可解决问题,以下图所示。
仅需要几行代码就可以解决的汉诺塔算法设计与分析_第1张图片
界面上共用三个堆,A是开始堆,B是目标堆,C是辅助堆。最终的目标就是将A上所有的圆盘利用C全部按顺序移动至B堆,具体分为以下三步:

  • ① 将上面的 n-1 块移动到辅助堆上;
  • ② 将第 n 块移动至目标堆上;
  • ③ 将辅助堆上的 n-1 块移动至目标堆上。

由于每次只能移动一块,所以第①和③步都是使用递规调用,而且第②步才是实际的操作。代码如文件末尾所示,移动3块圆盘只需要调用 hanoi('A', 3, 'B', 'C') 即可。运行结果如下所示:

Move A -> B.
Move A -> C.
Move B -> C.
Move A -> B.
Move C -> A.
Move C -> B.
Move A -> B.
public class Hannoi{
	public static void main(String[] args) {
		hanoi('A', 3, 'B', 'C');
	}

	/**
	 * 将指定的 
	 * @param a 开始堆。
	 * @param n 需要移动的圆盘数量。
	 * @param b 目标堆。
	 * @param c 辅助堆。
	 */
	static void hanoi(char a, int n, char b, char c) {
		if (n > 0) {
			hanoi(a, t - 1, c, b); // 操作 ①
			System.out.printf("Move %c -> %c.\n", a, b); // 操作 ②
			hanoi(c, t - 1, b, a); // 操作 ③
		}
	}
}	

扩展

在此基础之上,使用C#进行了扩展,实现了一个带有UI界面和动画效果的程序:源代码下载。 效果图如下所示:

仅需要几行代码就可以解决的汉诺塔算法设计与分析_第2张图片

[1] 汉诺塔,百度百科,https://baike.baidu.com/item/汉诺塔/3468295?fr=aladdin

你可能感兴趣的:(算法设计与分析)