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]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-of-life
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
from typing import List
import math
import copy
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        boardCopy=copy.deepcopy(board)
        neighbors = [(1,0), (1,-1), (0,-1), (-1,-1), (-1,0), (-1,1), (0,1), (1,1)]
        rows=len(board)
        columns=len(board[0])
        for i in range(rows):
            for j in range(columns):
                live=0
                for x in neighbors:
                    if 0<=i+x[0]<rows and 0<=j+x[1]<columns:
                        if boardCopy[i+x[0]][j+x[1]]==1:
                            live+=1
                if boardCopy[i][j]==1 and (live<2 or live>3):
                    board[i][j]=0
                if  boardCopy[i][j]==0 and live==3:
                    board[i][j]=1
#原地修改
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        rows=len(board)
        columns=len(board[0])
        directions=[(1,0),(-1,0),(0,1),(0,-1),(-1,-1),(-1,1),(1,-1),(1,1)]
        dd={0:0,
            1:1,
            '10':0,#原活现死
            '01':1,#原死现生
            }
        for i in range(rows):
            for j in range(columns):
                live=0
                for d in directions:
                    if 0<=i+d[0]<rows and 0<=j+d[1]<columns:
                      if board[i+d[0]][j+d[1]]==1 or board[i+d[0]][j+d[1]]=='10':
                        live+=1
                if (live<2 or live>3) and (board[i][j]==1 or board[i][j]=='01'):
                    board[i][j]='10'
                if live==3 and (board[i][j]==0 or board[i][j]=='10'):
                    board[i][j]='01'
        for i in range(rows):
            for j in range(columns):
                board[i][j]=dd[board[i][j]]
原文地址:https://www.cnblogs.com/hqzxwm/p/14410351.html