2015-10-14 126 views
0

我正在調試河內問題塔的一些解決方案,並總是發現一個混淆規則。我認爲有一個限制,說明「磁盤從一根杆的頂部滑到下一根杆上」。河內解決方案問題

我的問題是,如果第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); 
     } 
    } 
} 

由於提前, 林

+1

歡迎任何疑問。 –

+0

@SumeetSingh,查詢? –

+0

@Jayesh,很好! :) –

回答

2

有作爲沒有這樣的規則A盤滑出一個杆的頂部到物理下杆。您可以從一個杆,只要將磁盤移動到另一根杆爲

  • 您在
  • 沒有足夠的磁盤可以被放置在更小的磁盤
  • 頂端的一次移動一盤你可以移動將當前杆的上盤放置到目標杆的頂部。

所以它並不要求塔在物理上彼此相鄰。

+0

謝謝invisal,現在一切都很清楚。 :) –

1

河內問題的塔是使用recursion.There一個簡單的3步驟問題是三個杆:

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 
} 
} 
+1

當然,你需要一個條件來停止無限遞歸?目前這將繼續被稱爲負數。 – sprinter

+0

@SumeetSingh,謝謝,現在一切都很清楚。 :) –