每日一题力扣289 生命游戏

根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-of-life
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

正解:

大佬的答案太秀了

class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        m = len(board)
        n = len(board[0])
        if m <= 0 or n <= 0:
            return []
        old = copy.deepcopy(board)

        def cntLiveCell(i, j):
            cnt = 0
            directions = [(0, 1), (0, -1), (-1, 0), (1, 0),
                          (1, 1), (1, -1), (-1, 1), (-1, -1)]
            for (dx, dy) in directions:
                if i + dx >= 0 and i + dx < m and j + dy >= 0 and j + dy < n:
                    cnt += old[i + dx][j + dy]

            return cnt

        for i in range(m):
            for j in range(n):
                # 八个方向有几个活细胞
                cnt = cntLiveCell(i, j)
                if old[i][j] == 0 and cnt == 3:
                    board[i][j] = 1
                if old[i][j] == 1 and (cnt > 3 or cnt < 2):
                    board[i][j] = 0

作者:fe-lucifer
链接:https://leetcode-cn.com/problems/game-of-life/solution/python-o1-kong-jian-289-sheng-ming-you-xi-by-fe-lu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

后来自己写的:

class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        m = len(board)
        n = len(board[0])
        if m <= 0 or n <= 0:
            return []
        old = copy.deepcopy(board)

        def livecell(i,j):#当前的坐标
            cnt=0#初始化
            directions=[(0,1),(0,-1),(1,0),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)]#8个方向
            for (dx,dy) in directions:
                if i+dx>=0 and i+dx<m and j+dy>=0 and j+dy<n:
                    cnt+=old[i+dx][j+dy]#统计这个细胞周围有几个活细胞
            return cnt
        for i in range(m):
            for j in range(n):
                t=livecell(i,j)
                if old[i][j]==1 and t<2:
                    board[i][j]=0
                elif old[i][j]==1 and t>3:
                    board[i][j]=0
                elif old[i][j]==1 and t==2:
                    board[i][j]=1
                elif old[i][j]==1 and t==3:
                    board[i][j]=1
                elif old[i][j]==0 and t==3:
                    board[i][j]=1
        
原文地址:https://www.cnblogs.com/liuxiangyan/p/14474881.html