河内塔问题:
你有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)磁盘从一个塔的顶部滑到下一个杆上。
这是否意味着我无法将铭牌存放在临时变量中?它必须只在堆栈上?
如果是,那么我想我有我的答案,我可以关闭这个问题。
请确认。
答案 0 :(得分:3)
让我为您搜索 ...这是classic puzzle。
您应该使用每个塔的Stack类的一个实例来实现解决方案。有三个塔,所以你有三个堆栈实例。是的,当您从一个塔的顶部弹出一个磁盘时,必须立即将其推到下一个塔上。适当的陈述可能是
aTargetStack.push(aSourceStack.pop())
您编写的代码无法解决问题;它将每个磁盘依次抛向空中,然后按所需顺序将它们推到目标堆栈上: N 中的 N 磁盘移动。一个正确,理想的解决方案将采取 2 ^ N-1 移动。