力扣289. 生命游戏

模拟 + 染色

  • 思路:
    • 可以复制一个表格,然后根据规则两层循环模拟出结果,但是空间复杂度太高;
    • 可以复用原有数组,对其进行染色标记;
      • 最终状态是活的标记值 > 1,还原标记值时可以使用规则 val > 0;
      • 之前是活的现在是死的,标记成 -1,统计活细胞时可以使用规则 abs(val) = 1;
    • 根据规则归纳:
      • R1:如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡,状态由 live 变成 die,用 -1 标记;(原状态是 live,需要被统计成活细胞)
      • R2:如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活,状态没有发生变化;
      • R3:如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡,状态由 live 变成 die,用 -1 标记;(原状态是 live,需要被统计成活细胞)
      • R4:如果死细胞周围正好有三个活细胞,则该位置死细胞复活,状态由 die 变成 live,用 2 标记;(最终状态是 live)
    • 进行两次两重循环遍历:
      • 第一次进行染色;
      • 第二次染色还原;
cpp 复制代码
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        int row = board.size();
        if (0 == row) {
            return;
        }
        int column = board[0].size();
        if (0 == column) {
            return;
        }

        for (int r = 0; r < row; ++r) {
            for (int c = 0; c < column; ++c) {
                int live = 0;
                // statistics neighbors
                
                if (r > 0 && c > 0) {
                    // direct NW
                    if (std::abs(board[r - 1][c - 1]) == 1) {
                        live++;
                    }
                }
                if (r > 0) {
                    // direct N
                    if (std::abs(board[r - 1][c]) == 1) {
                        live++;
                    }                    
                }
                if (c > 0) {
                    // direct W
                    if (std::abs(board[r][c -1]) == 1) {
                        live++;
                    }
                }
                if (r + 1 < row) {
                    if (c > 0) {
                        // direct SW
                        if (std::abs(board[r + 1][c - 1]) == 1) {
                            live++;
                        }
                    }

                    // direct S
                    if (std::abs(board[r + 1][c]) == 1) {
                        live++;
                    }
                }
                if (c + 1 < column) {
                    // direct E
                    if (std::abs(board[r][c + 1]) == 1) {
                        live++;
                    }
                    if (r > 0) {
                        // direct NE
                        if (std::abs(board[r - 1][c + 1]) == 1) {
                            live++;
                        }
                    }
                    // direct SE
                    if (r + 1 < row) {
                        // direct NE
                        if (std::abs(board[r + 1][c + 1]) == 1) {
                            live++;
                        }
                    }
                }


                // rule 1 & 3
                if (board[r][c] == 1 && (live < 2 || live > 3)) {
                    // mark live -> die
                    board[r][c] = -1;
                }
                // rule 4
                if (board[r][c] == 0 && live ==  3) {
                    // mark die -> live
                    board[r][c] = 2;
                }
            }
        }

        // recover
        for (int r = 0; r < row; ++r) {
            for (int c = 0; c < column; ++c) {
                if (board[r][c] > 0) {
                    board[r][c] = 1;
                } else {
                    board[r][c] = 0;
                }
            }
        }
    }
};
  • 统计活细胞数量的逻辑比较朴素,可以进一步归纳美化;
相关推荐
揽星河..7 小时前
【C语言】扫雷游戏
c语言·算法·游戏
郝学胜-神的一滴10 小时前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
云上工程笔记10 小时前
用 AstraWork 复刻并二创一款网页地牢游戏:从链接到上线的完整工程实践
游戏
zrc00700713 小时前
steam无法登录 steam错误 登录时出现错误。请稍后再试。解决办法 steam无法登录解决办法 湖南地区steam DNS问题解决办法
windows·经验分享·游戏·缓存·游戏程序·创业创新·玩游戏
大囚长14 小时前
Kubernetes 的资源开销、适用边界,以及游戏与有状态负载的工程现实
游戏·容器·kubernetes
qq_252941316816 小时前
三角洲第一人称射击游戏(FPS)角色部位检测数据集 | 游戏目标检测、角色部位识别、小目标检测9296期
目标检测·游戏·计算机·目标跟踪·三角洲·三角洲游戏·身体
william_yangshun1 天前
【AI实战】Claude-Code-Game-Studios中文版使用教程:把Claude Code改造成49个Agent的游戏工作室
人工智能·游戏
流浪打工人1 天前
快乐小鸡游戏
游戏
Solange__2 天前
在线3D预览器、Blender和游戏引擎怎么选?按5类任务比较格式、隐私与编辑性
人工智能·游戏·3d·游戏引擎·blender·1024程序员节·关卡设计
不是万能的豆学长2 天前
游戏重构生活平衡新方式
游戏·重构·生活