LeetCode289. Game of Life

文章目录

一、题目

According to Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."

The board is made up of an m x n grid of cells, where each cell has an initial state: live (represented by a 1) or dead (represented by a 0). Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):

Any live cell with fewer than two live neighbors dies as if caused by under-population.

Any live cell with two or three live neighbors lives on to the next generation.

Any live cell with more than three live neighbors dies, as if by over-population.

Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.

The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously. Given the current state of the m x n grid board, return the next state.

Example 1:

Input: board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]

Output: [[0,0,0],[1,0,1],[0,1,1],[0,1,0]]

Example 2:

Input: board = [[1,1],[1,0]]

Output: [[1,1],[1,1]]

Constraints:

m == board.length

n == board[i].length

1 <= m, n <= 25

board[i][j] is 0 or 1.

Follow up:

Could you solve it in-place? Remember that the board needs to be updated simultaneously: You cannot update some cells first and then use their updated values to update other cells.

In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches upon the border of the array (i.e., live cells reach the border). How would you address these problems?

二、题解

cpp 复制代码
class Solution {
public:
    int dirs[8][2] = {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
    void gameOfLife(vector<vector<int>>& board) {
        int m = board.size(),n = board[0].size();
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                int liveNum = 0;
                //遍历周围8个位置
                for(int k = 0;k < 8;k++){
                    int x = i + dirs[k][0];
                    int y = j + dirs[k][1];
                    if(x < 0 || x >= m || y < 0 || y >= n) continue;
                    if(board[x][y] == 1 || board[x][y] == -1) liveNum++;
                }
                //更新状态
                if(board[i][j] == 1 && (liveNum < 2 || liveNum > 3)) board[i][j] = -1;
                else if(board[i][j] == 0 && liveNum == 3) board[i][j] = 2;
            }
        }
        //更新board
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(board[i][j] > 0) board[i][j] = 1;
                else board[i][j] = 0;
            }
        }
    }
};
相关推荐
hnjzsyjyj2 小时前
东方博宜OJ 2190:树的重心 ← 邻接表 or 链式前向星
数据结构·链式前向星·树的重心
yaoh.wang4 小时前
力扣(LeetCode) 13: 罗马数字转整数 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
ChoSeitaku4 小时前
NO15数据结构选择题考点|线性表|栈和队列|串
数据结构
T1ssy4 小时前
布隆过滤器:用概率换空间的奇妙数据结构
算法·哈希算法
hetao17338375 小时前
2025-12-12~14 hetao1733837的刷题笔记
数据结构·c++·笔记·算法
椰子今天很可爱5 小时前
五种I/O模型与多路转接
linux·c语言·c++
一直都在5725 小时前
数据结构入门:时间复杂度与排序和查找
数据结构
程序员zgh6 小时前
C++ 互斥锁、读写锁、原子操作、条件变量
c语言·开发语言·jvm·c++
鲨莎分不晴6 小时前
强化学习第五课 —— A2C & A3C:并行化是如何杀死经验回放
网络·算法·机器学习
搞科研的小刘选手7 小时前
【ISSN/ISBN双刊号】第三届电力电子与人工智能国际学术会议(PEAI 2026)
图像处理·人工智能·算法·电力电子·学术会议