面试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表示原来是活的,下一个状态要变成死

相关推荐
用户28735553259216 小时前
OpenResty 中 Lua 脚本实战示例(分场景讲清 Lua 解决了 Nginx 原生做不到的事)
面试
noipp16 小时前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
帅次16 小时前
Android 应用高级面试:Window 近1年高频追问 18 题
android·面试·职场和发展
Revolution6117 小时前
Node.js 是什么:前端项目里哪些事情由它完成
前端·面试·node.js
Hi李耶17 小时前
【LeetCode】9-回文数
算法·leetcode·职场和发展
日月云棠18 小时前
UE5 Lyra Messages 模块深度解析——从一条击杀消息看游戏事件系统的设计哲学
游戏·ue5
Ivan CloudBay19 小时前
SDK 游戏盾如何隐藏游戏服务器的真实 IP?
服务器·tcp/ip·游戏
魔术师Dix19 小时前
StartGame:Unity TDD 外部工程指南
学习·游戏·unity·c#·测试驱动开发
海绵天哥20 小时前
LeetCode Hot 100 | 链表(下)· 分组翻转与设计(C++ 题解)
c++·leetcode·链表
我要见SA姐11 天前
AI提示词遇见精密算法:TimeGuessr如何用数学魔法打造文化游戏新体验
人工智能·算法·游戏