面试150 生命游戏

思路

深度优先遍历的思路,对当前细胞八个方向进行遍历,统计存活的细胞,并通过标记修改board数组,如果细胞死亡则标记为-1,细胞复活标记为2。再次遍历数组,然后根据标记修改数组即可

python 复制代码
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        m=len(board)
        n=len(board[0])
        directions=[(-1,0),(0,-1),(0,1),(1,0),(1,1),(-1,1),(-1,-1),(1,-1)]

        def dfs(i,j):
            count=0
            for x,y in directions:
                new_x=x+i 
                new_y=y+j 
                if 0<=new_x<m and 0<=new_y<n and abs(board[new_x][new_y])==1:
                    count+=1
            return count

        for i in range(m):
            for j in range(n):
                live=dfs(i,j)
                if board[i][j]==1 and live<2:
                    board[i][j]=-1
                elif board[i][j]==1 and live>3:
                    board[i][j]=-1
                elif board[i][j]==0 and live==3:
                    board[i][j]=2
        for i in range(m):
            for j in range(n):
                if board[i][j]<0:
                    board[i][j]=0
                elif board[i][j]>0:
                    board[i][j]=1                

值得注意的是,abs(boardnew_xnew_y)==1,是为了正确统计当前细胞的邻居原本是"活"的数量。因为在原地修改的时候-1表示原来是活的,下一个状态要变成死

相关推荐
码匠许师傅11 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
wenyq711 小时前
LeetCode 2460. Apply Operations to an Array
算法·leetcode
青 春 记 忆12 小时前
LeetCode 142. 环形链表 II|Python 解法详解
python·leetcode·链表
Patrick_Wilson13 小时前
Web 认证方案技术指南
前端·后端·面试
神奇的程序员14 小时前
在这个独属于ai的时代,我终究是被裁员了
前端·后端·面试
wdloumiga16 小时前
使用 Construct 3零基础做一些2D小游戏
python·游戏·游戏2d
触底反弹16 小时前
🔥 从「为什么」到「怎么用」:TypeScript 类型约束与泛型完全指南
后端·面试·typescript
朋友圈自动点赞工具16 小时前
WD_BLACK P10游戏硬盘实测:72款游戏随身带还能剩
游戏·科技资讯
李剑一16 小时前
有点干,前端架构基础之:Web Worker到底是什么?它和Java中的线程是一个道理吗?
前端·面试·架构
从琳开始98917 小时前
优选算法——双指针(算法原理+力扣题)
算法·leetcode·职场和发展