zoukankan      html  css  js  c++  java
  • 每日一题力扣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
            
  • 相关阅读:
    vue插件(还真是第一次接触)
    Vue父组件向子组件传值以及data和props的区别
    Vue v-bind与v-model的区别
    vue 异步渲染
    vue动态加载不同的组件(分内部和外部组件)
    vue自定义组件的递归
    作用域插槽模板迭代的次数,取决于组件内部独立slot的数量
    说说 Vue.js 中的 v-cloak 指令
    C语言 system
    C语言 有符号、无符号
  • 原文地址:https://www.cnblogs.com/liuxiangyan/p/14474881.html
Copyright © 2011-2022 走看看