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 == boardi.length

1 <= m, n <= 25

boardij 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;
            }
        }
    }
};
相关推荐
tyler_download14 分钟前
deepseek后训练算法:位置编码算法RoPE详解1
算法
A7bert77721 分钟前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
青少儿编程课堂37 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
YSL0701241 小时前
一文通关-----排序
数据结构·算法
FlightYe11 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
ZhengEnCi11 小时前
GPT-6 Astra 爆改 Qwen 权重真有那么神吗:权重空间编程 0.016% 参数的真相
算法·架构
罗西的思考12 小时前
【轻量化复刻大模型 / KIMI K3】KDA(Kimi Delta Attention):并行
人工智能·算法·机器学习
by2099912 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble12 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长13 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++