不使用缓冲堆栈的汉诺塔

Tower of Hanoi WITHOUT using a buffer stack

汉诺塔问题:

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

谜题从排序的磁盘开始 按大小从上到下的升序排列(即,每个磁盘位于一个偶数的顶部 大一点)。您有以下限制条件:

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

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

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


问题: 为什么我们需要 second/buffer/intermediate 堆栈?

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

见代码:

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

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

    Integer temp = aSourceStack.pop();

    play(aSourceStack,aTargetStack);

    aTargetStack.push(temp);
}

我也违反了第二个约束:(2) 一个圆盘从一个塔的顶部滑到下一个杆上。

这是否意味着我不能将盘子存储在临时变量中?它只能进入堆栈?

如果是,那么我想我已经有了答案,我可以结束这个问题了。

请确认。

让我帮你搜索一下 ...这是一个classic puzzle.

您应该为每个塔使用 Stack class 的一个实例来实施解决方案。共有三座塔,因此您有三个 Stack 实例。是的,当您从一个塔顶弹出一个圆盘时,您必须立即将它推到下一个塔上。一个合适的陈述可能是

aTargetStack.push(aSourceStack.pop())

你写的代码没有解决问题;它依次将每个圆盘抛向空中,然后按所需顺序将它们推到目标堆栈上:N 个圆盘以 N 次移动。正确、理想的解决方案需要 2^N-1 步。