AI 的早期萌芽?用 Swift 演绎约翰·康威的「生命游戏」

article/2025/6/24 5:10:45

在这里插入图片描述
在这里插入图片描述

文章目录

    • 摘要
    • 描述
    • 题解答案
    • 题解代码分析
    • 示例测试及结果
    • 时间复杂度
    • 空间复杂度
    • 总结

摘要

你有没有想过,能不能通过简单的规则模拟出生与死亡?「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇,并用 Swift 实现一个原地更新的算法,完全不需要额外内存空间,还能用得很优雅。如果你是算法练习者或者对模型仿真感兴趣,这篇你一定不能错过。

描述

生命游戏最早由数学家 John Conway 提出,是一种“零玩家游戏”。什么意思?就是说,一旦设置好初始状态,系统会自动演化,不再需要人为干预。

我们把一个二维网格当作世界,每个格子就是一个细胞。每个细胞的状态可能是“活”或“死”,状态变化完全依赖它周围八个邻居的状态。核心的规则有这几条:

  1. 活细胞周围活邻居少于 2 个 → 死(孤独)
  2. 活细胞周围 2 或 3 个活邻居 → 继续活着
  3. 活细胞周围超过 3 个活邻居 → 死(过度拥挤)
  4. 死细胞周围恰好有 3 个活邻居 → 复活!

所以我们要做的就是根据这四条规则,在原数组上进行原地更新,生成下一轮的世界。

题解答案

我们使用一个小技巧来原地记录状态的变化:

  • 活→死 用 -1 表示
  • 死→活 用 2 表示

这样我们在遍历的时候可以保留旧状态(通过 abs(board[i][j]) 取得),等所有状态都计算完之后再统一转换回 01

题解代码分析

func gameOfLife(_ board: inout [[Int]]) {let m = board.countlet n = board[0].countlet directions = [(-1,-1), (-1,0), (-1,1),( 0,-1),         ( 0,1),( 1,-1), ( 1,0), ( 1,1)]for i in 0..<m {for j in 0..<n {var liveNeighbors = 0// 统计活邻居数量for dir in directions {let x = i + dir.0let y = j + dir.1if x >= 0 && x < m && y >= 0 && y < n {if abs(board[x][y]) == 1 {liveNeighbors += 1}}}// 应用规则if board[i][j] == 1 && (liveNeighbors < 2 || liveNeighbors > 3) {board[i][j] = -1 // 活→死}if board[i][j] == 0 && liveNeighbors == 3 {board[i][j] = 2 // 死→活}}}// 最终状态统一替换for i in 0..<m {for j in 0..<n {board[i][j] = board[i][j] > 0 ? 1 : 0}}
}

示例测试及结果

我们用几个例子跑一下看看效果。

var board1 = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]gameOfLife(&board1)
print(board1)
// 输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]var board2 = [[1,1],[1,0]]gameOfLife(&board2)
print(board2)
// 输出:[[1,1],[1,1]]

你可以把这段代码直接贴到 Xcode Playground 或命令行 Swift 项目里跑一跑,观察每轮世界的变化,非常直观。

时间复杂度

我们遍历了整个二维数组一次,并对每个元素最多再遍历 8 个邻居,所以:

时间复杂度:O(m * n)
其中 m 和 n 是二维数组的行数和列数。

空间复杂度

我们没有使用额外的数组,只是在原数组中用 -12 来标记变化。

空间复杂度:O(1)(原地算法)

总结

“生命游戏”听起来像是一种编程游戏,但其实它也是模拟系统、分布式模型、甚至人工生命研究中的一个缩影。通过这种原地算法优化,我们不仅节省空间,还能更贴近“状态转移”的本质。

这道题的亮点在于如何处理状态切换时的数据保存问题,如果直接改掉原始数据,我们就没法知道旧值是否活着。而用 -12 的技巧正好帮我们保留了历史信息,最终只需一轮替换就能搞定。


http://www.hkcw.cn/article/mqFCWSSaKH.shtml

相关文章

系统设计——系统架构分层设计经验

摘要 文章通过对 MVC 三层架构和 DDD 四层架构的深入分析&#xff0c;结合具体的代码示例和项目结构设计&#xff0c;为 Java 开发人员提供了全面的系统架构分层设计经验。在实际项目中&#xff0c;开发人员应根据项目的规模和业务复杂度选择合适的架构模式&#xff0c;并遵循…

Windows下编译zlib

本文记录在Windows下编译zlib的流程。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、编译 1.1 下载代码 git clone https://github.com/madler/zlib.git 1.2 构建 按照下表配置CMake&#xff0c; CMake…

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版

1.题目描述 2.思路 方法一&#xff1a; 定义其实坐标&#xff0c;右上角的元素&#xff08;0&#xff0c;n-1&#xff09;。进入while循环&#xff08;注意边界条件&#xff0c;行数小于m&#xff0c;列数要&#xff1e;0&#xff09;从右上角开始开始向左遍历&#xff08;比当…

域权限维持和后渗透密码收集

前言 本文仅用于网络安全领域的教育和研究目的&#xff0c;旨在帮助安全研究人员和渗透测试人员了解和防范黄金票据攻击与白银票据攻击。所有技术的使用必须在合法授权的环境下进行&#xff0c;未经授权的攻击行为是违法的。本文的目标是提高网络安全防护能力&#xff0c;帮助企…

法规解读——GB/T 前向碰撞预警功能FCW

一、前言 前方车辆碰撞预警系统是前向摄像头和前向毫米波能检测前方目标车辆并计算是否满足报警条件&#xff0c;在危险紧急情况下警告驾驶员采取刹车换道等操作避免碰撞。本文以GB/T 33577记录相关规范要求。 二、术语 碰撞报警 collision warning 系统向驾驶员发出需紧急避碰…

Vue-过滤器

过滤器 时间戳格式化 实现方式 计算属性方法过滤器 基础依赖 day.min.js 下载链接放到 相对路径 js 目录下 Computed 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>过滤器</title>…

Java 文件操作 和 IO(4)-- Java文件内容操作(2)-- 字符流操作

Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作 文章目录 Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作观前提醒&#xff1a;1. Java中操作文件的简单介…

【Qt】EventFilter,要增加事件拦截器才能拦截到事件

在构造函数中增加事件拦截器 void QObject::installEventFilter(QObject *filterObj) Installs an event filter filterObj on this object. For example:

Cypress + React + TypeScript

🧪 Cypress + React + TypeScript 组件测试全流程实战:从入门到自动化集成 在现代前端开发中,组件测试 是保障 UI 行为可靠性的重要手段。本文将通过一个 React 项目示例,实战演示如何结合 Cypress + React + TypeScript 实现从零配置到自动化集成的完整测试链路。 一、项…

cf每日刷题

目录 String&#xff08;800&#xff09; Skibidus and Amogu&#xff08;800&#xff09; Apples in Boxes&#xff08;1100&#xff09; String&#xff08;800&#xff09; https://codeforces.com/problemset/problem/2062/A #include <iostream> #include <…

FPGA纯verilog实现MIPI-DSI视频编码输出,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 MIPI 编解码方案 3、设计思路框架工程设计原理框图FPGA内部彩条RGB数据位宽转换RGB数据缓存MIPI-DSI协议层编码MIPI-DPHY物理层串化MIPI-LVDS显示屏工程…

极智项目 | 多模态大模型推理平台-Streamlit版(支持Qwen2.5/InternVL3/KimiVL三大模型)

多模态大模型推理测试Web应用 软件下载链接&#xff1a;下载 基于Streamlit的多模态大模型推理测试平台&#xff0c;支持Qwen2.5-VL、InternVL3、Kimi-VL三大模型&#xff0c;提供transformers和vLLM两种推理框架。 软件介绍 核心功能 多模型支持: 集成三大主流多模态大模型…

mysql慢sql的实际处理方案之一

复习mysql架构图 当大批量慢sql过来&#xff0c;显然就是占用了线程池的链接&#xff0c;然后长久不释放&#xff0c;所以会出现线程池满的问题&#xff0c;致使正常业务sql也全部阻塞&#xff0c;影响整个业务。 AI搜索如下&#xff1a; 可以考虑一种方案&#xff1a; 将线…

最小生成树

1 最小生成树的概论 最小生成树的概念 2 Kruskal算法 首先我们要熟记最小生成树的概念 必须是无向带权图&#xff0c;必须保证连通性&#xff0c;总的权值必须是最小的 如果无向带权图有n个节点&#xff0c;那么最小生成树一定有n-1个边 这个也被叫成k算法&#xff0c;很常用…

网络系统中安全漏洞扫描为何重要?扫描啥?咋扫描?

在网络系统中&#xff0c;安全漏洞扫描占据着极其重要的位置&#xff0c;这一环节有助于我们发现并消除潜在的安全隐患&#xff0c;进而提高网络安全防护的等级。下面&#xff0c;我将对此进行详尽的说明。 基本概念 漏洞扫描技术可以揭示并评估网站存在的安全风险&#xff0…

2025年- H62-Lc170--34.在排序数组中查找元素的第一个和最后一个位置(2次二分查找,标记向左寻找,标记向右寻找)--Java版

1.题目描述 2.思路 3.代码实现 public class H34 {public int[] searchRange(int[] nums, int target) {int start findFirst(nums, target);int end findLast(nums, target);return new int[]{start, end};}// 查找第一个出现的位置public int findFirst(int[] nums, int t…

VR/AR 显示瓶颈将破!铁电液晶技术迎来关键突破

在 VR/AR 设备逐渐走进大众生活的今天&#xff0c;显示效果却始终是制约其发展的一大痛点。纱窗效应、画面拖影、眩晕感…… 传统液晶技术的瓶颈让用户体验大打折扣。不过&#xff0c;随着铁电液晶技术的重大突破&#xff0c;这一局面有望得到彻底改变。 一、传统液晶技术瓶颈…

基于空天地一体化网络的通信系统matlab性能分析

目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 5.1 QPSK调制原理 5.2 空天地一体化网络信道模型 5.3 空天地一体化网络信道特性 6.参考文献 7.完整算法代码文件获得 1.引言 空天地一体化网络是一种将卫星通信…

基于FashionMnist数据集的自监督学习(生成式自监督学习AE算法)

目录 一&#xff0c;生成式自监督学习 1.1 简介 1.2 核心思想 1.3 常见算法 1.3.1 自动编码器&#xff08;Autoencoder&#xff09; 1.3.2 生成对抗网络&#xff08;GANs&#xff09; 1.3.3 变分自编码器&#xff08;VAE&#xff09; 1.3.4 Transformer-based 模型&…

腾讯位置商业授权关键词输入提示开发指南

概述 用于获取输入关键字的补完与提示&#xff0c;帮助用户快速输入。本接口为纯HTTP数据接口&#xff0c;需配合前端程序实现Autocomplete&#xff08;自动完成&#xff09;的效果。 请求URL 该请求为GET请求 https://apis.map.qq.com/ws/place/v1/suggestion 请求参数 名称必…