当前位置: 首页 > news >正文

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

leetcode题目链接 

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

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

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

0:死细胞转为死细胞
1:活细胞转为活细胞
2:活细胞转为死细胞
3:死细胞转为活细胞

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

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和1for (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. 邻居计算:使用方向数组计算每个细胞的活邻居数时,检查 1 和 2 状态。
  3. 状态更新:根据邻居数更新细胞的状态,但不立即改变 0 和 1,而是用 2 和 3 表示过渡状态。
  4. 最终转换:遍历整个面板,将 2 转为 03 转为 1,得到下一个状态。

http://www.mrgr.cn/news/9900.html

相关文章:

  • 浮点运算的硬件加速
  • 电压增益、功率增益及其之间的联系
  • 基于Springboot + vue + mysql 车辆充电桩管理系统 设计实现
  • Ubuntu 22.04上稳定安装与配置搜狗输入法详细教程
  • 【Linux 从基础到进阶】NFS与Samba文件共享配置
  • 学习笔记七:基于Jenkins+k8s+Git+DockerHub等技术链构建企业级DevOps容器云平台
  • C#网络请求封装,HttpClient 静态单实例
  • 浅谈Java SpringBoot和Spring区别
  • 2024 年顶级 Flutter UI 框架和库
  • 垂直电商的未来发展方向与开源 AI 智能名片 O2O 小程序的融合
  • 如何借助BI高效打造经营分析看板?从业七年的数据分析师给出这四点建议!
  • SpringBoot的异常java.lang.ClassNotFoundException: io.r2dbc.spi.ValidationDepth
  • Cesium 视频投射
  • NFT Insider #144:Sandbox 投资 9 万美元助力区块链活动
  • Ollama 使用指南:Linux、Windows 和 macOS
  • 2001-2023年上市公司数字化转型年报词频统计(吴非、赵宸宇、甄红线等300+个关键词)
  • 1、.Net UI框架:Platform Uno - .Net宣传系列文章
  • 身份证二要素验证接口如何用PHP进行调用
  • 中仕公考怎么样?2025国考报名流程介绍!
  • 使用Python实现深度学习模型:智能灾害响应与救援机器人