解题思路-leetcode第289题:生命游戏
题目描述:
根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。
示例 1:
输入:board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]
示例 2:
输入:board = [[1,1],[1,0]]
输出:[[1,1],[1,1]]
解题思路:本题采用与卷积神经网络中卷积操作类似的方法解题,首先对已知列表进行补0操作,在已知列表的外层加一层0。后建立一个3*3的卷积核,除中间元素为0外,其余元素均为1。然后遍历列表,只遍历补0后列表中属于原列表的部分。每遍历到一个元素,都用卷积核与当前元素周围的3*3矩阵进行乘法操作再相加,得到的值即为当前元素周围有几个活细胞,然后根据题目给的条件进行判断,改变当前元素值,遍历完后,返回补0后列表中属于原列表的部分。代码如下:
import numpy as np
class Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
x, y = len(board), len(board[0])
add_board = np.array([[0 for _ in range(y + 2)] for _ in range(x + 2)])
add_board[1:1+x, 1:1+y] = np.array(board)
kernel = np.array([[1, 1, 1], [1, 0, 1], [1, 1, 1]])
for i in range(1, x+1):
for j in range(1, y+1):
s = np.sum(kernel * add_board[i - 1:i + 2, j - 1:j + 2])
if add_board[i, j] == 1:
if s < 2 or s> 3:
board[i - 1][j - 1] = 0
else:
if s == 3:
board[i - 1][j - 1] = 1
提交后,通过。