[英]Towers of Hanoi solution issue
我正在調試有關河內塔問題的一些解決方案,並且總是發現一個令人困惑的規則。 我認為存在一個限制條件,即“磁盤從一個桿的頂部滑到另一個桿上”。
我的問題是,如果第45行起作用,這意味着“緩沖”桿在當前桿旁邊,那么“目標”桿不應在當前桿旁邊。 這意味着線46是不正確的,因為我們將桿移動到不與當前桿相鄰的位置。
但這似乎是唯一的解決方案? 如果有人能澄清這種混亂,那就太好了。
這是我正在調試的代碼:
public static void main(String[] args) {
int n = 5;
Tower[] towers = new Tower[n];
for (int i = 0; i < 3; i++) towers[i] = new Tower(i);
for (int i = n - 1; i >= 0; i--) towers[0].add(i);
towers[0].moveDisks(n, towers[2], towers[1]);
}
public class Tower {
private Stack < Integer > disks;
private int index;
public Tower(int i) {
disks = new Stack < Integer > ();
index = i;
}
public int index() {
return index;
}
public void add(int d) {
if (!disks.isEmpty() && disks.peek() <= d) {
System.out.println(“Error placing disk” + d);
} else {
disks.push(d);
}
}
public void moveTopTo(Tower t) {
int top = disks.pop();
t.add(top);
System.out.println(“Move disk” + top + “from” + index() + “to” + t.index());
}
public void print() {
System.out.println(“Contents of Tower“ + index());
for (int i = disks.size() - 1; i >= 0; i--) {
System.out.println(““ + disks.get(i));
}
}
public void moveDisks(int n, Tower destination, Tower buffer) {
if (n > 0) {
moveDisks(n - 1, buffer, destination);
moveTopTo(destination);
buffer.moveDisks(n - 1, destination, this);
}
}
}
預先感謝林
沒有這樣的規則,即A盤從一根桿的頂部滑到物理上的另一根桿上 。 您可以將磁盤從一根桿移動到另一根桿,只要
因此,它不需要塔架在物理上彼此相鄰。
河內塔的問題是使用遞歸的一個簡單的三步問題,共有三根桿:
start , buffer and the destination
步驟1:將n-1個磁盤從起點移動到緩沖棒。
步驟2:將第n個磁盤從起始位置移動到目標位置。
步驟3:將n-1個磁盤從緩沖區移動到目標位置。
就是說,這可以很容易地用Java編寫。
class Toh
{
public static void main(String []args)
{
int n=5;
toh(n,1,2,3);//move n disks from rod 1 to 3 using 2
}
public static void toh(int n,int start,int buffer,int destination)
{
if(n<1)
return;
toh(n-1,start,destination,buffer);//step 1
System.out.println("disk moved from rod "+start+" to "+destination);//step 2
toh(n-1,buffer,start,destination);//step 3
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.