康威生命游戏的邻居计数

3
def neighbors(matrix, r, c):

    live_neighbors = 0

    if matrix[r][c-1] != 0:
        live_neighbors += 1
    if matrix[r-1][c] != 0:
        live_neighbors += 1
    if matrix[r-1][c+1] != 0:
        live_neighbors += 1
    if matrix[r][c-1] != 0:
        live_neighbors += 1
    if matrix[r][c+1] != 0:
        live_neighbors += 1
    if matrix[r+1][c-1] != 0:
        live_neighbors += 1
    if matrix[r+1][c] != 0:
        live_neighbors += 1
    if matrix[r+1][c+1] != 0:
        live_neighbors += 1

    return live_neighbors

这是我目前编写的代码。如何计算边界单元格的邻居数量?如果使用此代码,将会出现一个索引超出范围的错误。


一个主要的考虑因素是边界:在位置[0, 0]的值是否有3个邻居?还是它会“翻转”并仍然有8个邻居? - Brad Solomon
无论如何,您可能会发现scipy.signal.convolve也很有用。 - Brad Solomon
2个回答

2
您可以使用辅助函数来检查边界:
def neighbors(matrix, r, c):
    def get(r, c):
        return 0 <= r < len(matrix) and 0 <= c < len(matrix[r]) and matrix[r][c]

    live_neighbors = 0

    if get(r, c-1) != 0:
        live_neighbors += 1
    if get(r-1, c) != 0:
        live_neighbors += 1
    if get(r-1, c+1) != 0:
        live_neighbors += 1
    if get(r, c-1) != 0:
        live_neighbors += 1
    if get(r, c+1) != 0:
        live_neighbors += 1
    if get(r+1, c-1) != 0:
        live_neighbors += 1
    if get(r+1, c) != 0:
        live_neighbors += 1
    if get(r+1, c+1) != 0:
        live_neighbors += 1

    return live_neighbors

您还可以在生成器表达式中使用 itertools.product 来替换 if 语句,以计算所有活着的邻居数量:

from itertools import product
def neighbors(matrix, r, c):
    def get(r, c):
        return 0 <= r < len(matrix) and 0 <= c < len(matrix[r]) and matrix[r][c]
    return sum(get(r + i, c + j) for i, j in product(range(-1, 2), 2) if i or j)

你为什么要写len(matrix(r))? - BrowserM
抱歉,那是个打错字。已经修复了,谢谢。 - blhsing
也许可以反转 if/else 条件语句,这样就可以使用比较链接了?if 0 <= r < len(matrix) and 0 <= c < len(matrix[r]): return matrix[r][c] else: return 0。实际上,你可以直接写成 return 0 <= r < len(matrix) and 0 <= c < len(matrix[r]) and matrix[r][c],然后在 if 语句中省略 != 0 - tobias_k
@tobias_k 确实,谢谢。我还利用这个机会进一步优化了代码的其余部分。 - blhsing

1

一种可能的解决方案,不需要所有那些if语句:

def neighbors(matrix, r, c):
    def get(r, c):
        if 0 <= r < len(matrix) and 0 <= c < len(matrix[r]):
            return matrix[r][c]
        else:
            return 0

    neighbors_list = [get(r-1, c-1), get(r-1, c), get(r-1, c+1),
                      get(r  , c-1),              get(r  , c+1),
                      get(r+1, c-1), get(r+1, c), get(r+1, c+1)]

    return sum(map(bool, neighbors_list))

matrix = [ [0, 0, 0, 0, 0],
           [0, 0, 0, 0, 1],
           [0, 0, 0, 1, 1],
           [0, 0, 0, 1, 1],
           [0, 0, 1, 1, 1] ]

print(neighbors(matrix, 0, 0))  # 0
print(neighbors(matrix, 1, 2))  # 1
print(neighbors(matrix, 3, 2))  # 4
print(neighbors(matrix, 4, 4))  # 3

如果单元格只有0或1的值,neighbors函数将简单地返回sum(neighbors_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接