从矩阵中查找距离k内的元素

时间:2011-05-16 07:10:46

标签: c++ algorithm matrix nearest-neighbor

给定n * n矩阵和值k,我们如何找到每个元素的所有邻居? 例如:在4*4矩阵中,k=2 说矩阵是:

[ 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 ++实现这个。

这是von Neumann邻居的问题,请一些人在c ++中实现它。谢谢

2 个答案:

答案 0 :(得分:1)

你的邻居会在目标元素周围形成菱形图案。钻石的点将远离目标元素k跳。所以顶部将是k行向上,左边是k列,等等。当你从一个级别到另一个级别时,钻石会均匀地展开。如果你从顶点开始向下走一排(靠近目标节点)那么你会向每一边走1。它在其他方向上是对称的。换句话说,邻居和目标节点之间的x坐标差异加上y的差异将是< = k。

所以只需要制作两个嵌套for循环来迭代这个钻石。外循环遍历行,内循环遍历列。从顶部开始,然后在每个外循环迭代中将菱形展开1,直到达到与目标元素相同的行,然后收缩直到达到底部点。 显然,你需要测试超出矩阵的边界条件。

答案 1 :(得分: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
 }
}