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;
}
}
}
}
}