【发布时间】:2014-02-22 01:05:28
【问题描述】:
我正在尝试解决河内塔问题的变体,其中存在三个钉子,但两个塔的高度和圆盘尺寸相同。任务是交换两座塔。
我的解决方案是将两个塔堆叠在一起形成一个大塔(相同大小的磁盘可以相互堆叠)然后再次将它们分开(当然是交换钉)。
我能够将两个塔堆叠在一起,但我无法反转我的算法以再次将它们分开。
在这种情况下,有两个塔,每个塔都有三个磁盘。一个在左边,一个在中间。在我的算法之后,有一个塔,右边有六个圆盘。
我的算法如下:(我用的是Java)
public void solve() {
combineTo(3, 0, 1, 2); // parameters: (height, from, to, temp)
splitUp(?, ?, ?, ?);
}
private void moveDisk(int from, int to){
// here are also a few other things going on but
// that doesn't matter in this case
System.out.println("from: "+from+" - to: "+to);
}
private void moveTower( int i, int from, int to, int temp) {
if (i == 0) return;
else{
moveTower( i-1, from, temp, to );
moveDisk(from, to);
moveDisk(from, to);
moveTower( i-1, temp, to, from );
}
}
private void combineTo( int i, int from, int to, int temp ){
if (i==0) return;
else{
combineTo(i-1, from, to, temp);
moveDisk(to, from);
moveTower(i-1, temp, to, from);
moveDisk(from, temp);
moveDisk(from, temp);
moveTower(i-1, to, temp, from);
}
}
private void splitUp( int i, int from, int to, int temp ){
if (i==0) return;
else{
???
}
}
那么我该如何使用splitUp 方法来扭转这种情况呢?
【问题讨论】:
-
这是作业题吗?
-
您可以使用队列来反转堆栈
-
是的。这是一个家庭作业问题,我想只是反转堆栈(因为我将所有动作都放在堆栈上以便能够向前和向后播放所有动作)。但任务是使用递归算法完成所有任务。
标签: java algorithm recursion towers-of-hanoi