2013-09-23 102 views
1

我正在處理包含元胞自動機方法的項目。我想要的是如何編寫函數來幫助查找二維數組中的所有鄰居。 例如我已經得到了大小x尺寸2D陣列[大小= 4這裏]標記爲x [0,0指數]在矩陣中尋找鄰域

[x][n][ ][n] 
[n][n][ ][n] 
[ ][ ][ ][ ] 
[n][n][ ][n] 

字段有鄰居標記爲[N] - > 8樓的鄰居。什麼我試圖做的是寫一個函數,可以找到鄰居窩寫數千if語句

有沒有人有一個想法如何做到這一點? 謝謝

+0

你是如何定義的鄰居?它是兩個軸上的距離爲「!= 2」的單元格嗎?還是有其他一些定義?這個例子並沒有真正顯示太多...... – viraptor

回答

2

對於元素(I,J)的N×M的矩陣鄰居:

int above = (i-1) % N; 
int below = (i+1) % N; 
int left = (j-1) % M; 
int right = (j+1) % M; 

decltype(matrix[0][0]) *indices[8]; 
indices[0] = & matrix[above][left]; 
indices[1] = & matrix[above][j]; 
indices[2] = & matrix[above][right]; 
indices[3] = & matrix[i][left]; 
// Skip matrix[i][j] 
indices[4] = & matrix[i][right]; 
indices[5] = & matrix[below][left]; 
indices[6] = & matrix[below][j]; 
indices[7] = & matrix[below][right]; 
+0

'(0-1)%N'可能與(N-1)不同,用'(i + N-1)%N'代替。 – Jarod42

1

在所有可能的排列中對座標進行加減運算。超出邊界的結果環繞(例如,-1變爲34變爲0)。基本上只需要幾個簡單的循環。

喜歡的東西

// Find the closest neighbours (one step) from the coordinates [x,y] 
// The max coordinates is max_x,max_y 
// Note: Does not contain any error checking (for valid coordinates) 
std::vector<std::pair<int, int>> getNeighbours(int x, int y, int max_x, int max_y) 
{ 
    std::vector<std::pair<int, int>> neighbours; 

    for (int dx = -1; dx <= 1; ++dx) 
    { 
     for (int dy = -1; dy <= 1; ++dy) 
     { 
      // Skip the coordinates [x,y] 
      if (dx == 0 && dy == 0) 
       continue; 

      int nx = x + dx; 
      int ny = y + dy; 

      // If the new coordinates goes out of bounds, wrap them around 
      if (nx < 0) 
       nx = max_x; 
      else if (nx > max_x) 
       nx = 0; 

      if (ny < 0) 
       ny = max_y; 
      else if (ny > max_y) 
       ny = 0; 

      // Add neighbouring coordinates to result 
      neighbours.push_back(std::make_pair(nx, ny)); 
     } 
    } 

    return neighbours; 
} 

示例使用了您:

auto n = getNeighbours(0, 0, 3, 3); 
for (const auto& p : n) 
    std::cout << '[' << p.first << ',' << p.second << "]\n"; 

打印出

 
[3,3] 
[3,0] 
[3,1] 
[0,3] 
[0,1] 
[1,3] 
[1,0] 
[1,1] 

這是正確的答案。

1

假設您在單元格(i, j)中。然後,在無限網格上,你的鄰居應該是[(i-1, j-1), (i-1,j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1)]

但是,由於網格是有限的,上述某些值將超出邊界。但我們知道模運算:4 % 3 = 1-1 % 3 = 2。所以,如果網格大小的n, m你只需要在上面的列表上應用%n, %m得到鄰居的正確列表:[((i-1) % n, (j-1) % m), ((i-1) % n,j), ((i-1) % n, (j+1) % m), (i, (j-1) % m), (i, (j+1) % m), ((i+1) % n, (j-1) % m), ((i+1) % n, j), ((i+1) % n, (j+1) % m)]

,如果你的座標是0n之間和0m之間的作品。如果你從1開始,那麼你需要通過做一個-1+1某處來調整上述內容。

對於您的情況n=m=4(i, j) = (0, 0)。第一個列表是[(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]。將模數運算應用到[(3, 3), (3, 0), (3, 1), (0, 3), (0, 1), (1, 3), (1, 0), (1, 1)],這些數字恰好是圖片中標記爲[n]的正方形。