leetcode289:生命游戏

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickFix攻击活动升级:可通过虚假谷歌会议画面传播恶意软件

最近&#xff0c;研究人员报告了一种新的 ClickFix 攻击活动&#xff0c;主要通过诱骗用户访问显示虚假连接错误的欺诈性 谷歌会议的页面&#xff0c;继而借此传播信息窃取恶意软件&#xff0c;主要针对 Windows 和 macOS 操作系统。 ClickFix是网络安全公司Proofpoint在5月份…

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)

第一步&#xff1a;搭建CAD类库dll开发环境。 第二步&#xff1a;添加窗体 第三步&#xff1a;添加控件 第四步&#xff1a;双击控件&#xff0c;在控件点击方法内输入代码 第五步&#xff1a;在主程序内实例化新建的form类&#xff0c;并弹窗form窗体 第六步&#xff1a;CAD命…

第五届人工智能与教育国际学术会议(ICAIE 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus 三、大会介绍 第五届人工智能与教育国际学术会议&#x…

学习虚幻C++开发日志——TSet

TSet 官方文档&#xff1a;虚幻引擎中的Set容器 | 虚幻引擎 5.5 文档 | Epic Developer Community (epicgames.com) TSet 是通过对元素求值的可覆盖函数&#xff0c;使用数据值本身作为键&#xff0c;而不是将数据值与独立的键相关联。 默认情况下&#xff0c;TSet 不支持重…

大数据-168 Elasticsearch 单机云服务器部署运行 详细流程

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

基于stm32的4G模块点灯实验

led模块功能封装 #include "led.h" #include "sys.h"//初始化GPIO函数 void led_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOB_CLK_ENABLE();//调用GPIO初始化函数gpio_initstruct.Pin GPIO_PIN_8 | GPIO_PIN_9;gpio_inits…

Linux基本指令一眼看懂(简洁表示)

首先先声明是简单表示&#xff0c;如果要全指令有链接 1. ls 指令 ls [选项] [文件/目录]常用选项: -l: 以长格式列出文件和目录的详细信息。 -a: 显示所有文件&#xff0c;包括隐藏文件&#xff08;以.开头的文件&#xff09;。 -h: 以人类可读的格式显示文件大小。 示例: …

基于stm32的esp8266的WIFI控制风扇实验

实验案例&#xff37;&#xff29;&#xff26;&#xff29;控制风扇 项目需求 电脑通过esp8266模块远程遥控风扇。 项目框图 ​ 风扇模块封装 #include "sys.h" #include "fan.h"void fan_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟…

数据库知识点整理

DDL DDL-数据库操作 show databases ------------ 查看所有数据库 select database(); ----------查看当前数据库 create database 数据库名&#xff1b;---- 创建数据库 use 数据库名&#xff1b; --------------使用数据库 drop database 数据库名&#xff1b;--…

day02_计算机常识丶第一个程序丶注释丶关键字丶标识符

计算机常识 计算机如何存储数据 计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。 进制 进制也就是进位计数制&#xff0c;是人为定义的带进位的计数方法 实例&#xff1a; // 在java 中 可以使用不同…

[PHP]Undefined index错误只针对数组

1、示例一 <?php $a null; var_dump($a[name]); 结果&#xff1a;无报错 2、示例二 <?php $a []; var_dump($a[name]);结果&#xff1a;报错

【JavaEE初阶】深入理解网络编程—使用UDP协议API实现回显服务器

前言 &#x1f31f;&#x1f31f;本期讲解关于TCP/UDP协议的原理理解~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么废话不…

JMeter 中两大高级线程组的区别与应用

一、JMeter 中的高级线程组概述 最近群里的测试小伙伴在问在 JMeter 中&#xff0c;“jpgc - Ultimate Thread Group”和“jpgc - Stepping Thread Group 阶梯加压”有哪些区别和实际应用场景有哪些&#xff1f;所以这里也跟大家分享一下 JMeter 作为一款强大的性能测试工具&a…

Java项目-基于Springboot的应急救援物资管理系统项目(源码+说明).zip

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

基于SpringBoot网上超市的设计与实现(论文+源码)_kaic

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此超市商品销售信…

100 种下划线 / 覆盖层动画 | 终极 CSS(层叠样式表)集合

还在为你的菜单项和链接寻找动画效果而感到疲惫吗&#xff1f; 不用再找了&#xff01;这里列出了 100 多种不同的动画。从简单的到更复杂的&#xff0c;你肯定能找到自己想要的。 无需 SVG&#xff08;可缩放矢量图形&#xff09;&#xff0c;无需 JavaScript&#xff08;脚…

小白也能剪出优秀视频:四大视频剪辑工具推荐!

无论是社交媒体上的短视频分享&#xff0c;还是专业制作的长视频内容&#xff0c;视频剪辑工具都扮演着至关重要的角色。今天&#xff0c;就让我们来探讨几款市面上流行的视频剪辑工具。 福昕视频剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 操作教程&#xff1a;立…

使用Diffutoon把视频转换成动漫风格,无需部署,开箱即用

无论是图片动漫转换以及视频动漫转换&#xff0c;我们前期也介绍过相关的模型&#xff0c;但是其模型输出的动漫视频不是有瑕疵&#xff0c;就是动漫效果不唯美&#xff0c;今天介绍一个modelscope社区开源的动漫风格转换模型Diffutoon。 Diffutoon模型接受视频作为输入&#x…

【C语言】循环中断break

在循环使用过程中&#xff0c;可能遇到某些情况需要终止循环。比如按座位查找一位学生&#xff0c;循环查找&#xff0c;找到时可以直接停止。后续的循环将不再执行。 break;只跳出一层循环 例子中的素数判断&#xff0c;查找到根号n停止&#xff1a;一个合数等于两个数的乘积…

新手必须掌握的Linux命令

1.1 常用系统工作命令 echo [linuxprobelocalhost /]$ echo $SHELL /bin/bash 使用$变量的方式提取SHELL的值&#xff0c;并输出到到屏幕上 date [linuxprobelocalhost /]$ date -s "20170901 8:30:00" 将系统时间设置为 reboot ----系统重启命令poweroff --…