2025年--Lc170--H289. 生命游戏(矩阵)--Java版

1.题目



2.思路

如果你直接根据规则更新原始数组,那么就做不到题目中说的 同步 更新。假设你直接将更新后的细胞状态填入原始数组,那么当前轮次其他细胞状态的更新就会引用到当前轮已更新细胞的状态,但实际上每一轮更新需要依赖上一轮细胞的状态,是不能用这一轮的细胞状态来更新的。


nei类似一个方向矩阵,控制该细胞的前后左右的方向

3.代码实现

java 复制代码
class Solution {
    public void gameOfLife(int[][] board) {
        //定义邻居数组
        int[] nei={0,-1,1};

        int rows=board.length;
        int cols=board[0].length;

        //// 创建复制数组 copyBoard
        int[][] copyBoard=new int[rows][cols];
         // 从原数组复制一份到 copyBoard 中
         for(int row=0;row<rows;row++)
         {
            for(int col=0;col<cols;col++)
            {
                copyBoard[row][col]=board[row][col];
            }
         }
          // 遍历面板每一个格子里的细胞
          for(int row=0;row<rows;row++)
          {
            for(int col=0;col<cols;col++)
            {
                 // 对于每一个细胞统计其八个相邻位置里的活细胞数量(9宫格)
                 int livenei=0;
                 for(int i=0;i<3;i++)
                 {
                    for(int j=0;j<3;j++)
                    { //排除自己(偏移为 (0,0) 的那个位置),只统计 8 个相邻格子
                        if(!(nei[i]==0&&nei[j]==0))
                        {//真实邻居坐标,row:当前正在统计的格子行下标(0 开始)。col:当前正在统计的格子列下标(0 开始)。
//表示相对当前位置,行/列可以各自偏移 -1、0、+1。nei[i]:对行的偏移量(-1/0/1)。nei[j]:对列的偏移量(-1/0/1)。把这些偏移加到 (row, col) 上,就得到某个邻居的坐标 (r, c)。
                        int r=(row+nei[i]);
                        int c=(col+nei[j]);
                         // 查看相邻的细胞是否是活细胞
                         //边界与存活判断:(r, c) 必须在棋盘范围内(不越界);
                         //copyBoard[r][c] == 1 表示这个邻居在旧状态是活的(通常先拷贝一份到 copyBoard,避免在同一轮更新中读到新状态);
                         if((r<rows&&r>=0)&&(c<cols&&c>=0)&&(copyBoard[r][c]==1))
                         {
                            livenei=livenei+1;
                         }
                    }
                 }
            }
             // 规则1/3:活细胞少于2或多于3 -> 死细胞      
            if((copyBoard[row][col]==1)&&(livenei<2||livenei>3))
            {
                board[row][col]=0;
            }
            //规则4
            if((copyBoard[row][col]==0&&(livenei==3)))
            {
                 board[row][col]=1;
            }
          }
    }
}
}
相关推荐
wbs_scy26 分钟前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo2 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup2 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952363 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.3 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19433 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12213 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px3 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS3 小时前
SpringBoot中自定义Starter
java·spring boot·后端
晴夏。4 小时前
UE Spawn出来的Actor的生命周期和管理方法
游戏·ue5·ue4·ue