leetcode289:生命游戏

devtools/2024/10/20 7:52:45/

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

相关文章

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…

QCC308x headset 做同时双向输出音频

QCC308x headset 做同时双向输出音频 /****************************************************************************** Copyright (c) 2014 - 2015 Qualcomm Technologies International, Ltd. FILE NAME audio_output.h DESCRIPTION Plugin that implements multichannel…

JavaScript:闭包、防抖与节流

一&#xff0c;闭包 1&#xff0c;什么是闭包 闭包是指一个函数和其周围的词法环境(lexical environment)的组合。 换句话说&#xff0c;闭包允许一个函数访问并操作函数外部的变量。 闭包的核心特性: 函数内部可以访问外部函数的变量即使外部函数已经返回&#xff0c;内部…

Android IP路由策略和防火墙

Android IP路由策略和防火墙 Platform: RK3368 OS: Android 6.0 Kernel: 3.10.0 文章目录 Android IP路由策略和防火墙ip route, ip rule, iptables简介ip routeip ruleiptables Android路由策略Android路由策略优先级命令查看当前路由策略 Android路由表命令查看路由表命令…

【分布式微服务云原生】探索负载均衡的艺术:深入理解与实践指南

探索负载均衡的艺术&#xff1a;深入理解与实践指南 摘要&#xff1a; 在本文中&#xff0c;我们将深入探讨负载均衡的概念、重要性以及实现负载均衡的多种算法。通过详细的技术解析、Java代码示例、流程图和对比表格&#xff0c;您将了解如何选择合适的负载均衡策略来优化资源…

[C++] C++类和对象 类的初始化列表和静态成员 类型转换/友元/内部类/匿名对象/编译器优化

目录 构造函数 1.1 构造函数赋值 1.2 初始化列表 1.3 explicit 关键字 2.类的静态成员 2.1 静态成员函数 2.2 静态成员变量 4.友元 4.1.友元函数 4.2.友元类 5. 内部类 5.1 内部类的概念及特性 构造函数 1.1 构造函数赋值 构造函数是在对象创建时由编译器自动调用…

Golang | Leetcode Golang题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; var (temp []intans [][]int )func findSubsequences(nums []int) [][]int {ans [][]int{}dfs(0, math.MinInt32, nums)return ans }func dfs(cur, last int, nums []int) {if cur len(nums) {if len(temp) > 2 {t : make([]int, len(…

Linux 内核态,用户态,以及如何从内核态到用户态,交互方式有哪些

一、Linux 内核态&#xff0c;用户态 Linux 内核态&#xff0c;用户态&#xff0c;以及如何从内核态到用户态&#xff0c;我来说下我的理解 很多面试官&#xff0c;面试也是照搬照套&#xff0c;网上找的八股文面试题&#xff0c;面试的人也是背八股文&#xff0c;刚好背到了&…