2011-11-22 71 views
1

我正在解決java二維數組中的NxN難題。我可以在四個方向移動到空的方塊:左,右,下或上。我的問題是,如果我得到空瓷磚(節點)的索引(行列值),我怎麼知道我是否必須移動左,右,下或上生成其後繼(鄰居)節點。如何確定移動的方向

例如,如果它是9個元素,然後我可以這樣做的一個1Dimensional數組:index是空的瓦片

if(index == 0){ 
      tempSuccessorNodes.add(new Node(swap(0,1,arrayPosition),curNode)); 
      tempSuccessorNodes.add(new Node(swap(0,3,arrayPosition),curNode)); 
     } 
     else if(index == 1){ 
      tempSuccessorNodes.add(new Node(swap(0,1,arrayPosition),curNode)); 
      tempSuccessorNodes.add(new Node(swap(1, 4, arrayPosition),curNode)); 
      tempSuccessorNodes.add(new Node(swap(1, 2, arrayPosition),curNode)); 
     } 

     .... 

     if(index == 8){ 
      tempSuccessorNodes.add(new Node(swap(8, 7, arrayPosition),curNode)); 
      tempSuccessorNodes.add(new Node(swap(8, 5, arrayPosition),curNode)); 
     } 

的索引,以產生當前節點的後繼者。但是這裏正在處理NxN(其中3x3是一個實例)。我如何知道在知道空單元格/瓦片/節點的索引後,是否必須移動左,右,向下或向上?

我有一個question這裏我先前公佈其與同一個任務我處理

感謝

回答

0

你必須把兩件事情考慮,以確定在哪個方向,你可以移動:

  1. 無論你已經訪問過的相鄰區塊(否則,你就有可能進入一個無限循環)的一個。爲此,每次你想訪問一個瓷磚,你必須首先檢查瓷磚是否已經被訪問;如果不將它添加到一個集合並訪問它,否則忽略它。請注意,檢查很容易,只需詢問瓷磚是否已經在設置中。
  2. 爲了確定每個瓦片的鄰居,你必須檢查四種可能的邊緣情況,在其他情況下就可以安全地訪問磚:
    • 該瓦片在第一行中,不要去拜訪以前的排
    • 該瓦片是最後一排,不要去訪問下一行
    • 該瓦片是第一列,不要去訪問前一列
    • 該瓦片在最後一列,不要去訪問下一列
0

這是simples喲認爲你不動的故事,而是空間。鑑於空磚的座標,它可以在所有方向上移動,除非它位於其中一個邊界上,這將限制移動。

+0

感謝您的回覆。所以如果我找到你的話,這意味着我必須同時調用up(),down(),left()和right()函數? –

+0

@EddyFreeman一般你不知道哪一個是正確的舉動,這就是爲什麼它是一個*搜索*,我的意思是空的瓷磚可以在所有的方向移動,它不會離開電路板。這決定了搜索樹,然後你必須定義你的搜索算法(可能使用一些啓發式來驅動搜索) –

+0

再次感謝。我使用manhattan heurestic(f = g + h),g是從開始節點到當前節點的開銷,h是從當前節點到目標節點的開銷。你能給我一點解釋怎麼做來推動搜索。這是我第一次這樣做,所以我需要一些具體的解釋來繼續。目前我有四個函數(up(),down(),left()和right()),那麼接下來我需要做什麼才能使用heureustic來確定下一步的移動? –