面试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(board[new_x][new_y])==1,是为了正确统计当前细胞的邻居原本是"活"的数量。因为在原地修改的时候-1表示原来是活的,下一个状态要变成死

相关推荐
乌暮7 小时前
JavaEE初阶---《JUC 并发编程完全指南:组件用法、原理剖析与面试应答》
java·开发语言·后端·学习·面试·java-ee
CCPC不拿奖不改名7 小时前
计算机网络:电脑访问网站的完整流程详解+面试习题
开发语言·python·学习·计算机网络·面试·职场和发展
鹏程十八少8 小时前
破解Android悬浮窗遮挡无障碍服务难题:我在可见即可说上踩过的坑
android·前端·面试
Moment8 小时前
富文本编辑器技术选型,到底是 Prosemirror 还是 Tiptap 好 ❓❓❓
前端·javascript·面试
独自破碎E8 小时前
【队列】求二叉树的层序遍历
leetcode
Tisfy8 小时前
LeetCode 0085.最大矩形:单调栈
算法·leetcode·题解·单调栈
倦王8 小时前
力扣日刷26110
算法·leetcode·职场和发展
Q741_1479 小时前
C++ 队列 宽度优先搜索 BFS 力扣 429. N 叉树的层序遍历 每日一题
c++·算法·leetcode·bfs·宽度优先
a程序小傲9 小时前
得物Java面试被问:边缘计算的数据同步和计算卸载
java·开发语言·数据库·后端·面试·golang·边缘计算
jinmo_C++9 小时前
Leetcode矩阵
算法·leetcode·矩阵