我正在尝试解决河内塔问题的变体,其中有三个钉子,但两个塔的高度和磁盘大小相同。任务是交换两个塔。
我的解决方案是将两个塔堆叠在一起成为一个大塔(相同大小的磁盘可以堆叠在彼此的顶部)并再次将它们分开(当然是交换钉)。
我能够将两座塔堆叠在一起,但我无法反转我的算法以再次将它们分开。
在这种情况下,有两个塔,每个塔都有三个磁盘。一个在左边,一个在中间。在我的算法之后,有一个塔,右边有六个圆盘。
我的算法如下:(我使用的是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
方法来逆转呢?