算法-生命游戏(289矩阵)

leetcode题目链接

这道题要求能考虑在原地算法解决本题,请注意,面板上所有格子需要同时被更新:你不能先更新某些格子,然后使用它们的更新后的值再更新其他格子。

这样的话我们就必须先定义一下标准,标记哪些位置该改变,而哪些位置不需要变化。

我们可以这样设计一个模拟:

0:死细胞转为死细胞

1:活细胞转为活细胞

2:活细胞转为死细胞

3:死细胞转为活细胞

之后呢,我们就可以依据该位置的值来进行死活细胞转换,下面是代码

cpp 复制代码
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
         int m = board.size();
        int n = board[0].size();

        // 方向数组,用于遍历八个方向
        vector<int> dx = {-1, -1, -1, 0, 0, 1, 1, 1};
        vector<int> dy = {-1, 0, 1, -1, 1, -1, 0, 1};

        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                int liveNeighbors = 0;

                // 计算活邻居的数量
                for (int k = 0; k < 8; ++k) {
                    int ni = i + dx[k];
                    int nj = j + dy[k];

                    if (ni >= 0 && ni < m && nj >= 0 && nj < n && (board[ni][nj] == 1 || board[ni][nj] == 2)) {
                        ++liveNeighbors;
                    }
                }

                // 根据规则更新状态
                if (board[i][j] == 1) {
                    if (liveNeighbors < 2 || liveNeighbors > 3) {
                        board[i][j] = 2;  // 活细胞转为死细胞
                    }
                } else {
                    if (liveNeighbors == 3) {
                        board[i][j] = 3;  // 死细胞转为活细胞
                    }
                }
            }
        }

        // 将状态转换回0和1
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (board[i][j] == 2) {
                    board[i][j] = 0;
                } else if (board[i][j] == 3) {
                    board[i][j] = 1;
                }
            }
        }
    }
};

解释

  1. 状态编码 :用 2 表示活细胞转死,用 3 表示死细胞转活。
  2. 邻居计算 :使用方向数组计算每个细胞的活邻居数时,检查 12 状态。
  3. 状态更新 :根据邻居数更新细胞的状态,但不立即改变 01,而是用 23 表示过渡状态。
  4. 最终转换 :遍历整个面板,将 2 转为 03 转为 1,得到下一个状态。
相关推荐
GreenTea5 小时前
vLLM 与 SGLang KV Cache 底层实现机制深度调研报告
前端·后端·算法
Bode_20025 小时前
多资源规划(含生产调度、库存管理及产能规划)的创新优化算法
算法·调度
土司大王6 小时前
LeetCode hot100——35.搜索插入位置:Java 二分模板、左闭右开区间与插入点分析
java·算法·leetcode
微三云生态系统架构师-彭丹6 小时前
远方好物S2B2C系统架构:一级分销与保证金托管的合规技术实现
人工智能·算法
土司大王7 小时前
LeetCode hot100——34.在排序数组中查找元素的第一个和最后一个位置:Java 二分模板、边界分析
java·算法·leetcode
罗西的思考8 小时前
机器人模型(WM / WAM / VLA)综合分析与对比:从「看」到「想」再到「做」
人工智能·算法·机器学习
小哈里9 小时前
【知识】从学科到实践:自然・工程・社科・人文|算法・研发・产品・品牌设计
程序人生·算法·产品·设计·工程
小π军10 小时前
最大重叠区间数量
数据结构·算法
镜像视界(浙江)科技有限公司10 小时前
《视频孪生之上:二维展示终结,三维空间计算重构城市逻辑》——跨摄像连续表达 × 三角测量厘米级定位 × 动态轨迹建模,构建新一代城市空间
大数据·人工智能·算法·矩阵·音视频·空间计算
a1879272183110 小时前
【算法】双指针与滑动窗口(二):滑动窗口——吃进、判定、吐出
算法·leetcode·双指针·滑动窗口·原理·模板·算法讲解