在距矩阵k的距离内找到元素

| 给定一个n * n矩阵和一个值k,我们如何找到每个元素的所有邻居? 例如:在
4*4
矩阵中,带有
k=2
说矩阵是:
[ 1  2  3  4
  5  6  7  8
  9 10 11 12
 13 14 15 16]
这些值是位置的索引,,3ѭ的邻居。
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 ++实现它。谢谢     
已邀请:
这应该可以解决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
 }
}
    
您的邻居将在目标元素周围形成菱形图案。菱形的点距目标元素k跳。因此,顶部将是k行,左侧将是k列,依此类推。随着级别的提高,菱形会均匀扩展。如果从最高点开始,然后向下移动一行(离目标节点更近),则每一侧出1。它在其他方向上对称。换句话说,邻居和目标节点之间x坐标的差加上y的差将<= k。 因此,只需在此菱形上进行两个嵌套的for循环即可。外循环遍历行,内循环遍历列。从顶部开始,然后在每个外循环迭代中将菱形扩展1,直到到达与目标元素相同的行,然后收缩直到到达最低点。 显然,您需要测试超出矩阵的边界条件。     

要回复问题请先登录注册