package ds.linerlist; import java.util.Stack; /** * 用栈和递归实现N阶汉诺塔。 * @author <a href="mailto:bao.yiming@live.cn" mce_href="mailto:bao.yiming@live.cn">Bao Yiming</a> */ public class Hanoi { /** * 将塔座source上按直径由小到大且至上而下编号为1至n * 的n个圆盘按规则搬到塔座target上,temp可用作辅助塔座。 * @param n 汉诺塔的阶。 * @param source 源塔。 * @param temp 中间塔。 * @param target 目标塔。 */ public void go(int n, Stack source, Stack temp, Stack target) { /** * 当汉诺塔的阶为1时,直接将其从源塔座搬至目标塔座。 * 当汉诺塔高于1阶时,将从上至下n-1个圆盘以目标塔为辅助搬至中间塔座, * 将第n个圆盘搬至目标塔座,再将中间塔座的圆盘搬至目标塔座上。 * 在将中间塔座的圆盘搬至目标塔座上的过程中,递归调用方法。 */ if (1 == n) { move(source, target); } else { go(n - 1, source, target, temp); move(source, target); go(n - 1, temp, source, target); } } /** * 搬圆盘,将源塔座的最顶上的圆盘搬到目标塔座。 * @param source * @param target */ private void move(Stack source, Stack target) { target.push(source.pop()); } }