2011-05-16 54 views
1

給定一個n * n矩陣和一個值k,我們如何找到每個元素的所有鄰居? 例如:在4*4矩陣,其中k=2 說矩陣爲:從矩陣中找出距離k內的元素

[ 1 2 3 4 
    5 6 7 8 
    9 10 11 12 
13 14 15 16] 

其中這些值是位置的索引,鄰居1 are 1,2,3,5,6,9。只有3,6 and 9來的值,因爲K = 2和不會是那裏,如果K值是= 1

同樣的6鄰居將1 2 3 5 6 7 8 9 10 11 and 14

能否請你幫我寫一個C代碼在C++來實現這一點。

這是馮諾依曼鄰域的問題,請問有人可以用C++來實現它。謝謝

+0

這功課嗎?如果是,則標記爲這樣。 :) – Xeo 2011-05-16 07:33:49

+1

你能擴展你的距離定義嗎?它是沿網格的k跳或半徑爲k的圓? – Adam 2011-05-16 07:34:33

+0

你需要定義你想要使用的鄰居類型。從你的例子我猜你的意思是[範諾伊曼鄰里](http://mathworld.wolfram.com/vonNeumannNeighborhood.html),但這並不明確。 – LiKao 2011-05-16 09:52:57

回答

0

這應該爲k = 1做訣竅。做一些小改動,讓它對所有人都有效k

int width = 4; 
int height = 4; 
int k = 1; 
int value = 2; 

bool hasRight = (value % width != 0); 
bool hasLeft = (value % width != 1); 
bool hasTop = (value > 4); 
bool hasBottom = (value < (height * width - width)); 

cout << value; // Always itself 
if(hasRight == true) { 
cout << value+1 << " "; // Right 
if(hasTop == true) { 
    cout << value-width << " " << value-width+1 << " "; // Top and Top-right 
} 
if(hasBottom == true) { 
    cout << value+width << " " << value+width+1; // Bottom and Bottom-right 
} 
} 

if(hasLeft == true) { 
cout << value-1 << " "; // Left 
if(hasTop == true) { 
    cout << value-width-1 << " "; // Top-left 
} 
if(hasBottom == true) { 
    cout << value+width-1 << " "; // Bottom-left 
} 
} 
+0

嘿這個代碼給出k = 1的對角元素。我能夠得到k = 2但比我無法得到的大,請幫助 – koder 2011-05-16 10:49:36

1

你的鄰居將圍繞你的目標元素形成一個菱形圖案。鑽石的點將離開目標元素k跳。所以頂部將排成k排,左側排成k列等等。鑽石從一個層次到另一個層次均勻擴展。如果你從頂點開始往下走(靠近目標節點),那麼你就往每邊出1。它在其他方向是對稱的。換句話說,鄰居和目標節點之間x座標的差值加上y的差值將爲< = k。

所以,只需製作兩個嵌套for循環遍歷這顆鑽石。外循環遍歷行,遍歷列的內循環。從頂部開始,然後在每次外循環迭代中將鑽石擴展1,直到達到與目標元素相同的行,然後收縮直到達到最低點。 顯然你需要測試邊界條件以外的矩陣。

+0

它是鑽石還是圓圈? – James 2011-05-16 07:29:48

+0

我把它看作鑽石,但還不清楚。 – Adam 2011-05-16 07:33:46

+0

你能否請用代碼格式解釋一下:) – koder 2011-05-16 10:50:34