• 【LeetCode】289. 生命游戏


    题目

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

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

    如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
    如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
    如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
    如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
    根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

    示例:

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

    进阶:

    • 你可以使用原地算法解决本题吗?请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。
    • 本题中,我们使用二维数组来表示面板。原则上,面板是无限的,但当活细胞侵占了面板边界时会造成问题。你将如何解决这些问题?

    代码

    class Solution {
    public:
        void gameOfLife(vector<vector<int>>& board) {
            int neighbors[3] = {0, 1, -1};
    
            int rows = board.size();
            int cols = board[0].size();
    
            // 创建复制数组 copyBoard
            vector<vector<int> >copyBoard(rows, vector<int>(cols, 0));
    
            // 从原数组复制一份到 copyBoard 中
            for (int row = 0; row < rows; row++) {
                for (int col = 0; col < cols; col++) {
                    copyBoard[row][col] = board[row][col];
                }
            }
    
            // 遍历面板每一个格子里的细胞
            for (int row = 0; row < rows; row++) {
                for (int col = 0; col < cols; col++) {
    
                    // 对于每一个细胞统计其八个相邻位置里的活细胞数量
                    int liveNeighbors = 0;
    
                    for (int i = 0; i < 3; i++) {
                        for (int j = 0; j < 3; j++) {
    
                            if (!(neighbors[i] == 0 && neighbors[j] == 0)) {
                                int r = (row + neighbors[i]);
                                int c = (col + neighbors[j]);
    
                                // 查看相邻的细胞是否是活细胞
                                if ((r < rows && r >= 0) && (c < cols && c >= 0) && (copyBoard[r][c] == 1)) {
                                    liveNeighbors += 1;
                                }
                            }
                        }
                    }
    
                    // 规则 1 或规则 3      
                    if ((copyBoard[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {
                        board[row][col] = 0;
                    }
                    // 规则 4
                    if (copyBoard[row][col] == 0 && liveNeighbors == 3) {
                        board[row][col] = 1;
                    }
                }
            }
        }
    };
    
  • 相关阅读:
    生成Ptc文件时候使用top camera比较好
    3delight 上关于ptex的讨论,3delight的开发者最后说ptex的内存表现并不比普通的贴图差,不知道是不是因为3delight不支持而故意说的
    闲来无事,写个算法关于11000放在含有1001个元素。。。
    寻最优数字筛选算法找出 “排列数列“ 对应的 “组合数列“
    入住博客园
    日常工作中收集整理的MSSQL 技巧
    序列化 和 反序列化 类
    对Singleton Pattern的一点修改
    快速幂 & 取余运算 讲解
    JDK动态代理实现
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12623645.html
Copyright © 2020-2023  润新知