2013-03-06 36 views
3

假设您有一个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

什么' m'代表? – 2013-03-06 02:41:44

+0

另外,哪七个邻居找到正确,哪一个不正确? – 2013-03-06 02:42:44

+0

@ Code-Guru m是矩阵的宽度(n是高度)。不正确的相邻正方形根据哪个边出点p坐落而变化。 – 2013-03-06 02:51:11

回答

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]