解题思路-leetcode第289题:生命游戏

本文介绍了LeetCode第289题——生命游戏的解题思路。生命游戏是由英国数学家康威在1970年发明的一种细胞自动机。题目中给出一个m×n的细胞面板,每个细胞有活或死两种状态,并遵循四条生存定律。文章通过示例解释了如何根据这些定律确定细胞的下一个状态,包括一个具体的示例输入和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解题思路-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

提交后,通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值