返回

生命游戏的奇妙世界:一个细胞自动机的奥秘

Android

生命游戏:简单规则,复杂生命

生命游戏是一种细胞自动机,由简单的规则指导,却能产生令人着迷的复杂行为。在本篇博客中,我们将深入了解生命游戏的规则、进化过程,并使用 Python 代码展示如何模拟其演化。

生命游戏的规则

生命游戏由以下基本规则定义:

  • 诞生规则: 如果一个死细胞周围有恰好三个活细胞,则该死细胞将在下一代中变为活细胞。
  • 存活规则: 如果一个活细胞周围有恰好两个或三个活细胞,则该活细胞将在下一代中仍然存活。
  • 死亡规则: 如果一个活细胞周围有少于两个或多于三个活细胞,则该活细胞将在下一代中死亡。

这些规则看似简单,但它们却能产生出令人惊讶的多样性模式,从稳定的静态图案到混沌的振荡器,甚至自组织的生命形式。

生命游戏的进化

生命游戏的进化遵循一个简单的过程:

  1. 初始化面板: 初始化一个包含死细胞或活细胞的面板,表示生命游戏的宇宙。
  2. 同时更新: 根据生命游戏的规则,同时更新面板中的每个细胞。
  3. 重复: 重复步骤 2,直到达到稳定状态(没有细胞状态发生变化)或达到最大迭代次数。

LeetCode 289:模拟生命游戏

LeetCode 289 问题挑战我们模拟生命游戏的进化。给定一个初始面板,我们必须模拟特定代数的生命游戏进化。

Python 代码实现:

def gameOfLife(board):
    # 定义邻域细胞的相对位置
    neighbors = [(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]

    # 创建一个新面板来存储下一代的状态
    new_board = [[0] * len(board[0]) for _ in range(len(board))]

    # 遍历每个单元格
    for i in range(len(board)):
        for j in range(len(board[0])):
            # 计算周围活细胞的数量
            live_neighbors = 0
            for neighbor in neighbors:
                x, y = i + neighbor[0], j + neighbor[1]
                if 0 <= x < len(board) and 0 <= y < len(board[0]) and board[x][y] == 1:
                    live_neighbors += 1

            # 根据规则更新细胞的状态
            if board[i][j] == 1:
                if live_neighbors < 2 or live_neighbors > 3:
                    new_board[i][j] = 0
                else:
                    new_board[i][j] = 1
            else:
                if live_neighbors == 3:
                    new_board[i][j] = 1

    # 更新面板
    for i in range(len(board)):
        for j in range(len(board[0])):
            board[i][j] = new_board[i][j]

    return board

结论

生命游戏是一个迷人的系统,它展示了即使是简单的规则也能产生出复杂的现象。它不仅是一个智力上的挑战,而且还激发了众多科学和技术领域的应用,例如图像处理和人工智能。

常见问题解答

  1. 生命游戏的稳定状态有多少种? 无限多种。
  2. 生命游戏中是否存在自组织的生命形式? 是的,例如滑翔机和蜂巢。
  3. 生命游戏是否可以用来模拟现实世界的现象? 是的,例如交通流和疾病传播。
  4. 生命游戏是否有解决 NP 完全问题的潜力? 尚不确定。
  5. 为什么生命游戏如此引人入胜? 因为它将简单的规则与丰富的模式和行为结合在一起。