2015-04-12 53 views
1

我有一些代碼應該找到二維數組中8個相鄰單元中最小的一個。當這段代碼運行時,最小的代碼被移動到,並且代碼再次循環運行。然而,當它運行時,代碼最終會導致堆棧溢出錯誤,因爲它會在兩點之間跳轉。這似乎是一個邏輯悖論,好像Y < X然後X! Y.所以它認爲這是我的錯,而不是我的邏輯。這裏是我的代碼:尋找二維數組中的最小鄰居

private Point findLowestWeight(Point current) { 
    float lowest = Float.MAX_VALUE; 
    Point ret = new Point(-1, -1); 
    LinkedList<Point> pointList = new LinkedList<Point>(); 
    for (int i = -1; i <= 1; i++) { 
     for (int j = -1; j <= 1; j++) { 
      if (!(i == 0 && j == 0)) { 
       if ((current.x + i >= 0 && current.x + i <= imageX - 2) 
       && (current.y + j >= 0 && current.y + j <= imageY - 2)) { 
        pointList.add(new Point(current.x + i, current.y + j)); 
       } 
      } 
     } 
    } 
    for (Point p : pointList){ 
     if (map[p.x][p.y] < lowest){ 
      lowest = map[p.x][p.y]; 
      ret = p; 
     } 
    } 
    return ret; 
} 
+0

imageX和imageY到底是什麼? – CandiedOrange

+0

如果您正在搜索鄰居並且不包括中心,那麼總會有交換。你應該將'最低'與'map [current.x] [current.y]'進行比較,看看交換點是否真的有必要。 – Fox

+0

imageX和imageY是數組的寬度和高度,由於數據結構的方式,除了一個特殊情況外,每個點總是會有一個較低的值,這個代碼永遠不會在 –

回答

0

你需要一個停止的情況。

找到2D陣列中8個相鄰單元中最小的一個。當這個代碼運行時,最小的被移動到,並且代碼在一個循環中再次運行。

是一個很好的開始但沒有任何關於停止的方法。

你關心當前單元的價值嗎?如果是這樣,你需要檢查9而不是8。如果你只是想要下山,那麼你需要檢查你去過的地方,或者任何平坦的多細胞谷會讓你陷入無限循環。如果向下移動,請考慮移動。

如果你真的不在乎你在哪裏,那麼即使是一個單細胞谷也會讓你陷入一個無限循環,因爲你在它裏面跳來跳去。在這種情況下,您需要一些其他停止條件。考慮在imageX * imageY迭代後停止。

+0

啊,謝謝,這段代碼是從遞歸函數調用的,並且在停止子句中有一個錯字 –

0

即使最小鄰居大於中心值,您是否仍然移動? 例子:

2 2 2 2 
2 0 1 2 
2 2 2 2 

你開始與中心小區0的最小的鄰居是1,如果你移動到1,最小的鄰居爲0,可以繼續不已。 如果最小的鄰居大於當前的單元格,那麼您可能不應該移動它。