【问题标题】:Finding elements within distance k from a matrix从矩阵中查找距离 k 内的元素
【发布时间】:2023-03-29 17:28:02
【问题描述】:

给定一个 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++实现这个吗?

这是冯诺依曼邻域的问题,请有人用c++实现它。谢谢

【问题讨论】:

  • 这是作业吗?如果是,请将其标记为这样。 :)
  • 你能扩展你对距离的定义吗?是沿网格跳 k 跳还是半径为 k 的圆?
  • 您需要定义您想要使用的社区类型。从你的例子我猜你的意思是van Neumann neighborhood,但这并不清楚。
  • 附言。只要稍微处理一下不等式,范诺依曼邻域的定义就可以很容易地扩展到算法中。因此,如果您使用它,您的算法将非常简单。

标签: c++ algorithm matrix nearest-neighbor


【解决方案1】:

这应该可以解决 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=1 的对角线元素。我可以得到 k=2 但比我无法得到的更大,请帮助
【解决方案2】:

您的邻居会在您的目标元素周围形成菱形图案。菱形的点将距离目标元素 k 跳。所以顶部将向上 k 行,左侧将超过 k 列,等等。随着您从一层到另一层,菱形会均匀扩展。如果您从最高点开始向下走一排(靠近目标节点),那么您向每一侧走 1。它在其他方向上是对称的。换句话说,邻居和目标节点之间的 x 坐标差加上 y 的差将是

因此,只需创建两个迭代此菱形的嵌套 for 循环。外循环遍历行,内循环遍历列。从顶部开始,然后在每次外部循环迭代中将菱形扩大 1,直到到达与目标元素相同的行,然后收缩直到到达底部。 显然,您需要测试超出矩阵的边界条件。

【讨论】:

  • 是菱形还是圆形?
  • @rohit,我不认为 stackoverflow.com 是实现生成机器。答案很有启发性,现在应该很容易实现。如果你还做不到,那就学习吧。
猜你喜欢
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
相关资源
最近更新 更多