在折叠矩阵中查找邻近单元格

4 投票
1 回答
2151 浏览
提问于 2025-04-17 18:04

假设你有一个 NxM 的矩阵。比如说,一个 4x4 的矩阵:

0  1  2  3
4  5  6  7
8  9  10 11
12 13 14 15

每个单元格周围都有八个相邻的单元格。比如,单元格 5 的相邻单元格是:0, 1, 2, 4, 6, 8, 9, 10。

0 1 2
4 5 6
8 9 10

而且,相邻的单元格也可以通过矩阵的边缘来找到,所以单元格 7 的相邻单元格是 2, 3, 0, 5, 4, 10, 11, 8。

2  3 | 0
6  7 | 4
10 11| 8

你同样可以把矩阵的顶部和底部也考虑进去。

如果你随机选择一个点 (p),有没有简单的方法来找到所有八个相邻单元格的值呢?到目前为止,我想出了这个列表,其中 m 是矩阵的宽度(在我们的例子中是 4)。

adjacentcells = [p+1, p-1, p+m, p-m, p+m-1, p+m+1, p-m-1, p-m+1]
for value in adjacentcells:
    if value < 0:
        value = value + len(matrix)
    if value >= len(matrix)
        value = value % len(matrix)
    adjacentlist.append(value)

不过,当你选择一个角落的单元格时,这个方法返回了 7 个正确的相邻值,还有一个错误的单元格。有人能指出我哪里出错了吗?

*由于一些复杂(愚蠢)的原因,我把矩阵存储为一个字符串,这就是为什么我可以用 len(matrix) 得到 16。

1 个回答

3

你需要在两个方向上分别使用取模运算,而不仅仅是在计算出的索引上使用。

试试这个辅助函数:

def addr(x,y,m,n):
  """
  Given an MxN matrix stored in a 1-d sequence,
  return the index of (possibly wrapped) X,Y
  """
  return (y%n)*m+(x%m)

现在你可以计算相邻的单元格了:

def getAdjacentCells(x,y):
  adjacentlist = []
  for dx in (-1, 0, +1):
    for dy in (-1, 0, +1):
      if(dx != 0 or dy != 0):
        adjacentlist.append(addr(x+dx, y+dy, 4, 4))
  return adjacentlist

而且,你可以证明这个方法是有效的:

# 5
assert sorted(getAdjacentCells(1,1)) == [0,1,2,4,6,8,9,10]
# 7
assert sorted(getAdjacentCells(3,1)) == [0, 2, 3, 4, 6, 8, 10, 11]
# 15
assert sorted(getAdjacentCells(3,3)) == [0, 2, 3, 8, 10, 11, 12, 14]

撰写回答