河内塔没有使用缓冲堆栈

时间:2016-05-03 13:40:36

标签: recursion stack towers-of-hanoi

河内塔问题:

你有3个塔和N个磁盘 可以滑到任何塔上的不同尺寸。

谜题从磁盘排序开始 按从上到下的大小的升序排列(即,每个磁盘位于偶数的顶部 更大的)。您有以下约束:

(1)一次只能移动一个磁盘。

(2)磁盘从一个塔的顶部滑到下一个杆上。

(3)磁盘只能放在较大的磁盘上。 编写程序,使用Stacks将磁盘从第一个塔移动到最后一个。

问题:为什么我们需要第二个/缓冲区/中间堆栈?

我在不使用缓冲区堆栈的情况下解决了这个问题。 我使用了方法(递归)创建的隐式堆栈。

参见代码:

public void play(Stack<Integer> aSourceStack,Stack<Integer> aTargetStack){

    if(aSourceStack.isEmpty()){
        return;
    }

    Integer temp = aSourceStack.pop();

    play(aSourceStack,aTargetStack);

    aTargetStack.push(temp);
}

我也违反了第二个限制条件:(2)磁盘从一个塔的顶部滑到下一个杆上。

这是否意味着我无法将铭牌存放在临时变量中?它必须只在堆栈上?

如果是,那么我想我有我的答案,我可以关闭这个问题。

请确认。

1 个答案:

答案 0 :(得分:3)

让我为您搜索 ...这是classic puzzle

您应该使用每个塔的Stack类的一个实例来实现解决方案。有三个塔,所以你有三个堆栈实例。是的,当您从一个塔的顶部弹出一个磁盘时,必须立即将其推到下一个塔上。适当的陈述可能是

aTargetStack.push(aSourceStack.pop())

您编写的代码无法解决问题;它将每个磁盘依次抛向空中,然后按所需顺序将它们推到目标堆栈上: N 中的 N 磁盘移动。一个正确,理想的解决方案将采取 2 ^ N-1 移动。