2013-11-04 113 views
-1

假設我想代表一個有100個樓層的10 * 10房間。我可以從任何一層開始穿過房間,但是,有些樓層之間有牆壁。 CS說,我正在試圖做一個10 * 10的網格房間,其中每個方格代表一個樓層。每個樓層都有一定的特徵,它可以表示爲一個節點,但整個網格包含這些節點的列表。什麼是鏈接網格正方形最有效的方法?

我試圖將每個方塊連接到與之相關的方塊。 這個關係可以描述如下: - 除了網格邊緣上的那個之外,每個正方形在頂部,右邊,上邊和下邊都有另一個邊。

例如,網格左上角的第一層只與右側的樓層和下面的樓層有關係。

- 另外,有些樓層不能連接在一起,假設它們之間有一個塊。樓層號前一個例子中的一個不能與它下面的鏈接,因爲它們之間有一堵牆。

我用一個指針到每個節點 - 方聯繫或落地式到其相關的節點:

public class Node{ 

private Node right; 
private Node left; 
private Node up; 
private Node down; 

//constructor other methods 
} 

然而,這種解決方案可能需要很多地方在內存中,假設我們有100個節點,每個節點有4個指針!

我已經通過爲每個節點分配ID來更改此解決方案,然後在每個節點中都有一個int []數組,可以存儲相關節點的數量。

該解決方案在網格類中引入了另一個問題! 假設改變後,在Node類的新方法將是:

public void setNeighbors(int[] neighbors) { this.neighbors = neighbors; } 

正當我要創建的每個節點,將其添加到列表中網格類,我得寫100線,每個節點一個!

int [] n1 ={2}; grid.getEntry(1).setNeighbors(n1); 
int [] n2 ={1,3}; grid.getEntry(2).setChars(n2); 
. 
. 
. 
And so on.. 

我的問題是,我該如何通過儘可能高效和乾淨的代碼來解決問題。

我怎樣才能代表靜態正方形之間的關係,而不必在每一步創建一個數組或不必寫100行。

我發現廣場之間的數學關係,但我不能使用它,因爲一些方格不能鏈接到ONSE旁邊,因爲他們之間的牆..

+0

我看不出有什麼不對您發佈的節點類。它使遍歷非常容易。我猜可能很難填充。取決於一個節點是否需要知道它的鄰居是誰。我真的沒有看到你認爲你通過添加ID屬性而不是使用對象引用獲得了什麼。 – tom

+0

我不喜歡400指針的想法。此外,我仍然必須做100行,但它看起來像這樣'grid.getEntry(2).setNeighbors(grid.getEntry(1),grid.getEntry(3),null,null);' – Lamia

+0

「400指針的想法」遠遠好於創建400個ID(本質上是指針)並自己管理它們,這是您提出的替代方案。您可以將地板放在一個二維節點陣列中,在每個節點中創建一個乾淨的節點,然後遍歷指定左/右/上/下節點的數組。不需要100行代碼。 – tom

回答

0

你可以計算曼哈頓距離而不是euklidian距離。

1

我認爲你應該專注於在嘗試修改微量內存之前獲取工作代碼。它被稱爲提前優化

爲了避免「100行的問題」,你可以初始化一個樓層做這樣的事情(未經測試):

Node[][] floor = new Node[10][10]; 
    for (int i=0;i<10;i++){ 
     for (int j=0;i<10;i++){ 
      floor[i][j] = new Node(); 
     } 
    } 

    for (int i=0;i<10;i++){ 
     for (int j=0;j<10;j++){ 
      if (i<9) 
       floor[i][j].down = floor[i+1][j]; 
      if (i>1) 
       floor[i][j].up = floor[i-1][j]; 
      if (j<9) 
       floor[i][j].right = floor[i][j+1]; 
      if (j>1) 
       floor[i][j].up = floor[i][j-1]; 
     } 
    } 
+0

這是我以前的想法,但由於牆壁問題,我很難實施它。我想我會去爭取它,然後我會分配那些在他們之間有牆的人。謝謝 – Lamia

相關問題