leetcode289:生命游戏

news/2024/10/20 6:37:25/

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 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]]

提示:

  • m == board.length
  • n == board[i].length
  • 1 <= m, n <= 25
  • board[i][j] 为 0 或 1

进阶:

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

步骤 1:问题性质分析

题目定义
  • 输入:给定一个包含 m x n 个格子的二维数组 board,每个格子代表一个细胞,细胞的状态为 1(活细胞)或 0(死细胞)。
  • 输出:返回更新后的二维数组,遵循康威生命游戏的四条规则进行更新。
康威生命游戏的规则
  1. 活细胞如果周围少于 2 个活细胞,则死亡(模拟孤独死亡)。
  2. 活细胞如果周围有 2 或 3 个活细胞,则继续存活。
  3. 活细胞如果周围有超过 3 个活细胞,则死亡(模拟过度拥挤死亡)。
  4. 死细胞如果周围有正好 3 个活细胞,则复活。
题目要求
  • 同时更新:即所有的细胞状态更新是同时发生的,因此不能先更新一部分细胞,然后依赖这些更新的细胞去更新其他细胞。
  • 原地算法:要求使用常量额外空间来完成更新,这意味着不能创建额外的二维数组来存储更新后的状态。
边界条件
  • 边界上的细胞需要特殊处理,因为它们的邻居数会少于 8 个,特别是四角的细胞。

步骤 2:解题思路分析

解题步骤
  1. 状态的存储问题

    • 由于需要同时更新状态,且我们希望不使用额外的空间,问题是如何在不破坏原有状态的前提下,存储和区分当前状态与更新后的状态。
  2. 状态转换的技巧

    • 我们可以通过引入一个特殊的状态来暂存下一步的状态。
    • 定义:
      • 1 -> 0:从活细胞变成死细胞,可以暂存为 -1 表示 "将要死亡"。
      • 0 -> 1:从死细胞变成活细胞,可以暂存为 2 表示 "将要复活"。
      • 这样,我们可以在遍历矩阵时,用这些中间状态标记细胞变化,等所有变化标记完之后,再进行一次遍历,将所有中间状态转换为最终状态。
  3. 算法设计

    • 遍历每个细胞,统计该细胞周围 8 个细胞中的活细胞数,根据规则判断该细胞的下一个状态,并用特殊值(-12)标记。
    • 完成第一轮遍历后,再遍历整个矩阵,将标记值 -1 转换为 02 转换为 1
时间复杂度
  • 每个细胞都需要遍历其周围的 8 个细胞,总体时间复杂度为 O(m * n),其中 mn 是矩阵的行数和列数。
空间复杂度
  • 由于使用原地算法,除了常数个辅助变量外,没有额外的空间需求,因此空间复杂度为 O(1)

步骤 3:C++ 代码实现

步骤 4:算法的启发

  1. 状态转换技巧

    • 在需要同时更新的数据结构中,保持当前状态的同时存储新状态是一个常见问题。本题中的状态转换(活细胞死亡标记为 -1,死细胞复活标记为 2)是一种巧妙的解决方案。这种方法常用于需要在原地修改数据但不能立即覆盖的场景。
  2. 算法优化

    • 本题使用了原地算法,节省了额外的空间。这种技巧不仅适用于二维矩阵问题,在一维或更高维度的复杂问题中也非常常见。
  3. 处理大规模数据集

    • 生命游戏的复杂度与输入矩阵的大小成正比,处理大规模数据时,算法的空间和时间复杂度尤为重要。通过原地算法,我们避免了不必要的内存开销。

步骤 5:实际生活中的应用

  1. 生态模拟

    • 生命游戏可以用来模拟生态系统中物种的繁衍与死亡。通过简单的规则模拟,可以看到生态系统如何演变。这在生物学、环境科学领域有潜在应用,比如模拟森林、湖泊生态系统的演变过程。
  2. 自动化调度和资源管理

    • 类似的细胞自动机模型可以用于模拟复杂的资源调度和自动化管理场景。比如,在智能交通系统中,模拟各个交通路口的交通流量变化,可以通过这样的规则演化预测拥堵。
  3. 图像处理和计算机视觉

    • 在某些图像处理算法中,也可以使用生命游戏的规则进行图像像素的变化模拟,特别是在基于规则生成纹理或模拟自然过程(如沙滩、火焰等动态效果)时。

http://www.ppmy.cn/news/1540452.html

相关文章

宝塔PHP8.1安装fileinfo拓展失败解决办法

在宝塔面板中安装PHP8.1后&#xff0c;安装fileinfo扩展一直安装不上&#xff0c;查看日志有报错&#xff0c;于是手动来安装也报错。 宝塔报错&#xff1a; 手动命令行编译安装同&#xff0c;也有报错 cd /www/server/php/81/src/ext/fileinfo/ make distclean ./configure …

sharding sphere 加解密功能 like语句 SQL 解析报错

问题描述 应用在使用 sharding sphere 来实现加密后&#xff0c;对于 like sql 语句解析抛异常&#xff0c;异常信息如下&#xff1a; sharding sphere 版本 5.3.2 xml 文件SQL 语句&#xff1a; <select id"countSchoolByStatus" parameterType"java.la…

word取消自动单词首字母大写

情况说明&#xff1a;在word输入单词后首字母会自动变成大写 &#xff08;1&#xff09;点击菜单栏文件 &#xff08;2&#xff09;点击“更多”——>“选项” &#xff08;3&#xff09;点击“校对”——>“自动更正选项” &#xff08;4&#xff09;取消“句首字母大写…

vue3 笔记-插槽

结构类似的模块&#xff0c;我们可以考虑用插槽&#xff0c;以便后续复用&#xff1a; 代码&#xff1a; 1.插槽 <script setup> defineProps({title: {required: true,type: String},number: {required: true,type: Number} }) </script><template><d…

【STL】string类的使用

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 string类的介绍--为什么学习string类 一、string类的默认成员函数 构造函数(constructor) 析构函数(destructor) 赋值运算符重载operator 二…

【漏洞复现】畅捷通T+ FileUploadHandler.ashx 任意文件上传漏洞

免责声明: 本文旨在提供有关特定漏洞的信息,以帮助用户了解潜在风险。发布此信息旨在促进网络安全意识和技术进步,并非出于恶意。读者应理解,利用本文提到的漏洞或进行相关测试可能违反法律或服务协议。未经授权访问系统、网络或应用程序可能导致法律责任或严重后果…

openresty“热部署“lua

一、前言 频繁reload 或者restart影响测试使用nginx&#xff0c;修改lua脚本后要实际查看效果值&#xff0c;使用关闭lua代码缓存&#xff0c;可以实现实时查看代码效果。 每次请求都会从磁盘中加载lua脚本&#xff0c;生产上面不要开启&#xff0c;影响响应速度 二、修改ngin…

【Java后端】一个软件的详细开发流程

本文旨在为读者提供一个全面的软件开发概览&#xff0c;从软件开发的流程到技术栈的介绍&#xff0c;我们将一步步深入探讨。&#xff08;本文只是粗略讲解&#xff09; 1. 软件开发整体介绍 作为软件开发工程师&#xff0c;我们有必要掌握软件开发的整个流程&#xff0c;明确…