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;
            }
        }
    }
};
相关推荐
Adios7942 小时前
设置交集大小至少为2
数据结构·算法·leetcode
程序喵大人5 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
野生风长9 小时前
C++入门基础:从命名空间到引用与指针的全面解析
开发语言·c++
来一碗刘肉面9 小时前
栈的应用(表达式求值)
数据结构·算法
yurenshi16689 小时前
20 账号以内矩阵怎么选?聚媒通、融媒宝、新榜小豆芽、矩阵通功能、价格实测对比
线性代数·矩阵
xiaowang1234shs10 小时前
怪兽轻断食技术深度测评:从断食计时引擎到AI识别算法的工程实践解析
数据库·人工智能·算法·macos·机器学习·p2p·visual studio
小果因子实验室10 小时前
量化研究--策略迁移算法1研究
算法
Escalating_xu10 小时前
C++可变参数模板与引用折叠精讲
开发语言·c++
Web极客码10 小时前
如何用三段式确定性剪枝,为 LLM Agent 砍掉 35% 的 Token 成本?
服务器·人工智能·算法·机器学习