zoukankan      html  css  js  c++  java
  • 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]]
    
  • 相关阅读:
    Java中==和equals的区别
    (转)JAVA-反射机制的使用
    JAVA三框架工作原理是什么?
    Spring的IoC模式
    JavaEE中为什么出现中文乱码?
    Android--Apache HttpClient(2种实现)
    Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
    Android—Http连接之GET/POST请求
    2014 12 04
    struts2的HelloWorld的基本过程
  • 原文地址:https://www.cnblogs.com/hqzxwm/p/14410351.html
Copyright © 2011-2022 走看看