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

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

文章目录

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

摘要

你有没有想过,能不能通过简单的规则模拟出生与死亡?「生命游戏」正是这样一种充满魅力的数学模拟系统。这篇文章我们来聊聊它的规则到底有多神奇,并用 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.pswp.cn/news/907702.shtml

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

相关文章

web ui自动化工具playwright

playwright是微软开源的一款web ui自动化工具&#xff0c;该工具有很多亮点&#xff0c;解决以前困扰web UI自动化测试的很多难点。这篇博客将介绍playwright主要特点。 playwright支持录制减少了编写成本 如果要使用playwright的录制功能&#xff0c;有两种途径&#xff0c;途…

移动安全Android——客户端静态安全

一、反编译保护 测试工具 Jadx GitHub - skylot/jadx: Dex to Java decompiler PKID [下载]PKID-APP查壳工具-Android安全-看雪-安全社区|安全招聘|kanxue.com 测试流程 &#xff08;1&#xff09;通过Jadx对客户端APK文件进行反编译&#xff0c;观察是否进行代码混淆 &…

04-redis-分布式锁-edisson

1 基本概念 百度百科&#xff1a;控制分布式系统之间同步访问共享资源方式。 在分布式系统中&#xff0c;常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0c;往往需要互斥来防止…

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 <…

AWS WebRTC:获取ICE服务地址(part 1)

建立WebRTC连接的第二步是获取ICE服务地址。 ICE全称&#xff1a;Interactive Connectivity Establishment&#xff0c;建立互动连接。 ICE 服务地址&#xff0c;主要是 TURN 和 STUN 服务器的地址&#xff0c;用于 WebRTC 在 NAT 网络环境中协商建立连接。 上代码&#xff…

Python兴趣匹配算法:从理论到实战的进阶指南

目录 一、兴趣匹配算法的技术栈解析 1. 基础特征匹配阶段 2. 向量空间模型阶段 3. 深度学习阶段 二、工程化实践关键技术 1. 特征工程体系 2. 相似度计算优化 三、典型应用场景实现 1. 社交好友推荐系统 2. 电商商品推荐系统 四、性能优化与挑战应对 1. 计算性能优…

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结&#xff1a; 前言&#xff1a; C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据&#xff0c;我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域&#xff1a; 代…

Go语言之接口与多态 -《Go语言实战指南》

接口是 Go 语言实现 多态 的核心机制。本章将帮助你理解接口的设计哲学、动态行为&#xff0c;以及它如何让 Go 实现面向接口编程的能力。 一、什么是接口&#xff1f; 接口是一组方法签名的集合&#xff0c;任何类型只要实现了接口中声明的所有方法&#xff0c;就被视为实现了…

JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范

&#x1f6e0;️ 一、JSR 303是什么&#xff1f; JSR 303&#xff08;Java Specification Requests 303&#xff09;是Java EE 6的子规范&#xff0c;全称​​Bean Validation​​。它通过注解方式对JavaBean的属性值进行标准化校验&#xff0c;例如检查非空、长度、格式等规则…

【图像处理入门】3. 几何变换基础:从平移旋转到插值魔法

摘要 掌握图像的几何变换相当于学会「图像的空间魔法」。本文将带你理解平移/旋转/缩放的数学原理&#xff0c;掌握OpenCV中warpAffine和getAffineTransform的核心用法&#xff0c;对比最近邻、双线性等插值算法的优劣。通过图像翻转、镜像、透视变换实战&#xff0c;学会用变…

微信小程序学习目录

个人简介 &#x1f468;‍&#x1f4bb;‍个人主页&#xff1a; 魔术师 &#x1f4d6;学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全栈发展 &#x1f6b4;个人状态&#xff1a; 研发工程师&#xff0c;现效力于政务服务网事业 &#x1f1e8;&#x1f1f3;人生格言&…

QT 5.15.2 程序中文乱码

1. 在.pro文件中添加&#xff1a; msvc { QMAKE_CXXFLAGS /source-charset:utf-8 /execution-charset:utf-8 }备注&#xff1a;.pro文件只有在选择 qmake 方式才会生成。 [Cmake 只会生成 CMakeLists.txt 文件] 2. 在文件首部增加以下程序行 #pragma execution_character_s…

Unity UI设计优化与模式原则

前言 在 Unity 中设计高效且可维护的 UI 系统时&#xff0c;需要结合性能优化和设计模式两大核心方向。以下是关键原则及实践方法&#xff1a; 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀&#xff01; 一、UI 性能…

CppCon 2014 学习: The Implementation of Value Types

“The Implementation of Value Types” 在C里&#xff0c;通常指的是如何设计和实现**值类型&#xff08;value types&#xff09;**的类&#xff0c;确保它们符合值语义&#xff08;value semantics&#xff09;&#xff0c;也就是说&#xff1a; 对象的赋值和拷贝操作应该是…

每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h

6. 475.供暖器(中等&#xff0c;学习check函数双指针思想) 475. 供暖器 - 力扣&#xff08;LeetCode&#xff09; 思想 1.冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在&#xff0c;给出…

【计算机网络】第2章:应用层—应用层协议原理

目录 1. 网络应用的体系结构 2. 客户-服务器&#xff08;C/S&#xff09;体系结构 3. 对等体&#xff08;P2P&#xff09;体系结构 4. C/S 和 P2P 体系结构的混合体 Napster 即时通信 5. 进程通信 6. 分布式进程通信需要解决的问题 7. 问题1&#xff1a;对进程进行编址…

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南

随着互联网技术的不断发展&#xff0c;在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分&#xff0c;用户可以在线下单、查询订单状态&#xff0c;管理员可以处理订单、管理…

vBulletin未认证API方法调用漏洞(CVE-2025-48827)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

计算机模拟分子合成有哪些应用软件?

参阅&#xff1a;Top 创新大奖 以下是用于计算机模拟分子合成&#xff08;包括逆合成设计、分子对接、分子动力学模拟及综合设计平台&#xff09;的主流应用软件分类总结&#xff0c;结合其核心功能和应用场景进行整理&#xff1a; &#x1f52c; 一、逆合成设计与路线规划软件…

Excel 中的SUMIFS用法(基础版),重复项求和

1. 首先复制筛选条件所在的列&#xff0c;去除重复项目 数据 》重复项 》删除重复项 2. 输入函数公式 SUMIFS(C:C,A:A,E2) 3. 选中单元格&#xff0c;通过 ShiftF3 查看函数参数 第一个参数&#xff1a;求和区域&#xff0c;要累加的值所在的区域范围 第二个参数&#xff1a…