leetcode-289:生命游戏

简介: leetcode-289:生命游戏

题目

题目连接

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;

2.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;

3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;

4.如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

示例 1:

输入:board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]

输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]

示例 2:

输入:board = [[1,1],[1,0]]

输出:[[1,1],[1,1]]

解题

方法一:

class Solution {
public:
    vector<vector<int>> dirs={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1}};
    void gameOfLife(vector<vector<int>>& board) {
        int m=board.size(),n=board[0].size();
        vector<vector<int>> res(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int count=0;
                for(vector<int>& dir:dirs){
                    int x=i+dir[0];
                    int y=j+dir[1];
                    if(x<0||x>=m||y<0||y>=n) continue;
                    count+=board[x][y];
                }
                if(board[i][j]==1){
                    if(count<2||count>3) res[i][j]=0;
                    else res[i][j]=1;
                }else{
                    if(count==3) res[i][j]=1;
                    else res[i][j]=0;
                }
            }
        }
        board=res;
    }
};

方法二:原地替换-位运算

int类型有32位,而原board中,只有 0、1,只占用一个位。因此可以将第2个位,用于存储结果。最后将第2个位刷新成最低位

class Solution {
public:
    vector<vector<int>> dirs={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-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 count=0;
                for(vector<int>& dir:dirs){
                    int x=i+dir[0];
                    int y=j+dir[1];
                    if(x<0||x>=m||y<0||y>=n) continue;
                    count+=board[x][y]&1;//只累加最低位
                }
                if(board[i][j]==1){
                    if(count<2||count>3) board[i][j]|=0;
                    else board[i][j]|=2;
                }else{
                    if(count==3) board[i][j]|=2;
                    else board[i][j]|=0;
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                board[i][j]>>=1;
            }
        }
    }
};

相关文章
|
5月前
LeetCode题:174. 地下城游戏
LeetCode题:174. 地下城游戏
58 0
LeetCode题:174. 地下城游戏
|
2月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
43 3
|
2月前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
37 1
|
2月前
|
算法
LeetCode第45题跳跃游戏 II
LeetCode第45题"跳跃游戏 II"的解题方法,通过一次循环和选择每个位置的最大可跳距离,有效减少了跳跃次数,简化了问题。
|
4月前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
35 3
|
4月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
4月前
|
算法
力扣经典150题第三十八题:生命游戏
力扣经典150题第三十八题:生命游戏
29 0
|
4月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏