假设你有一个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(矩阵)并获得16。
答案 0 :(得分:2)
您需要在两个轴上独立使用模运算,而不仅仅是在计算的索引上。
尝试使用此辅助函数:
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]