康威生命游戏

news/2024/9/27 21:22:23

题目:康威生命游戏
分类:数组、矩阵、模拟
根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 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

思路

  • 源自题解,也是容易忽视的,导致后续数据被污染,部分出错;

此处复制一个newboard,所有的检索均针对newborad[i][j],在本元素的值确认后赋给board[i][j]

  • 鉴于对每个元素来说,都要检测8个邻居,可以看作三行三列,除开自己,而这里需要用本身来表示邻居,明显有-1、0、1的关系(行与列均是如此),所以可以共用一个偏移量skewing来表示邻居的行与列,分别是

  • 根据规则对live++

  • 注意此时skewing[s]和skewing[t]代表的是偏移的量

    当skewing[s]和skewing[t]都为0时,我们实际上并没有检查任何邻居。这种情况发生在当前细胞位于边界或角落时,它只有1或2个邻居。在这种情况下,我们不需要更新该细胞的状态,因为它的邻居数量已经符合上述规则。

  • 这里区分一个经典出错
    !((a == b) && (c == d)) 和 (a != b) && (c != d)

    • 对于 !((a == b) && (c == d)):
      此表达式取真的条件是当 a 不等于 b 或者 c 不等于 d。即如果两对比较中至少有一对不相等,则此表达式为真。
      用逻辑表达式来表示就是: !((a == b) && (c == d)) 等价于 (a != b) || (c != d),根据德摩根定律。
    • 对于 (a != b) && (c != d):
      此表达式取真的条件是当 a 不等于 b 且 c 不等于 d。即两对比较都必须不满足相等关系,此表达式才为真。
      这两个表达式虽然在某种程度上是逻辑等价的,但它们在具体实现上有着细微的差异。
/*java*/class Solution {public void gameOfLife(int[][] board) {int m = board.length;int n = board[0].length;int live = 0;int[] skewing = {-1,0,1};int[][] newboard = new int[m][n];//i即newboard的行,j即newboard的列for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {newboard[i][j] = board[i][j];}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {live = 0; // 重置 live 计数器/*扫描8个元素*/for (int s = 0; s < 3; s++) {for (int t = 0; t < 3; t++) {if (!(skewing[s] == 0 && skewing[t] == 0)) {int front = i + skewing[s];int back = j + skewing[t];if (front >= 0 && front < m && back >= 0 && back < n ) {if(newboard[front][back] == 1)live++;}}}}if (newboard[i][j] == 1) {if (live < 2 || live > 3) {board[i][j] = 0;}} else if (live == 3) {board[i][j] = 1;}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56430.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

iLogtail 开源两周年:社区使用调查报告

尽管收集到的有效问卷数量可能未达到传统统计显著性的门槛,但这批反馈却异常宝贵,为我们的策略制定与优化提供了第一手的洞察力。这些见解不仅直接源自实际应用场景,还蕴含了用户对于提升 iLogtail 功能体验、文档丰富度及社区互动多样性的真切期待,为后续的社区建设与发展…

CogVideoX huggingface 接口说明文档

https://huggingface.co/docs/diffusers/api/pipelines/cogvideox 预览

回归树模型 0基础小白也能懂(附代码)

回归树其实是将输入空间划分为$M$个单元,每个区域的输出值是该区域内所有点$y$值的平均数回归树模型 0基础小白也能懂(附代码) 啥是回归树模型 大家在前面的部分学习到了使用决策树进行分类,实际决策树也可以用作回归任务,我们叫作回归树。而回归树的结构还是树形结构,但…

如何通过API接口实现库存的精准掌控

https://img2024.cnblogs.com/blog/3506472/202409/3506472-20240904105309327-1011277110.png在电子商务的快速发展中,库存管理已成为衡量企业运营效率的关键指标。随着消费者对快速配送和商品可用性的期望不断提高,电商企业必须找到更智能、更高效的库存管理方法。电商库存…

manim边学边做--曲线类

manim中曲线,除了前面介绍的圆弧类曲线,也可以绘制任意的曲线。 manim中提供的CubicBezier模块,可以利用三次贝塞尔曲线的方式绘制任意曲线。 关于贝塞尔曲线的介绍,可以参考:https://en.wikipedia.org/wiki/B%C3%A9zier_curve。 本文主要介绍贝塞尔曲线和两种带箭头的曲线…

51nod 2842 城际旅行

原题链接这题因为要求满足 t 时间内,所以用 dp ,不过我们的状态比较特殊,\(dp[i][j]\) 表示到 \(i\) 点时经过 \(j\) 个点的最短时间,因为题目为 DAG 所以要用拓扑排序,每到一个点,枚举所有出边,更新出点的状态 \(f[v][j+1]=min(f[v][j+1],f[u][j])\),最后的答案就是所…