289. 生命游戏
题目
根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。
代码
class Solution {
public void gameOfLife(int[][] board) {
int[] neighbors={0,1,-1};
int rows=board.length;
int cols=board[0].length;
for(int row=0;row<rows;row++){
for(int col=0;col<cols;col++){
int liveNeighbors=0;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(!(neighbors[i]==0 && neighbors[j]==0)){
int r=row+neighbors[i];
int c=col+neighbors[j];
if((r<rows && r>=0) && (c<cols && c>=0) && (Math.abs(board[r][c])==1)){
liveNeighbors++;
}
}
}
}
if(board[row][col]==1 && (liveNeighbors<2 || liveNeighbors>3 )){
board[row][col]=-1;
}
if(board[row][col]==0 && liveNeighbors==3){
board[row][col]=2;
}
}
}
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
if (board[row][col] > 0) {
board[row][col] = 1;
} else {
board[row][col] = 0;
}
}
}
}
}
思考
我看官解写的。看题目,感觉就是按原来数组模拟,但代码写起来很麻烦,就直接看官解了。
1.遍历周围八个位置
采用neighbors={0,1,-1},根据neighbor去计算周围八个位置的坐标
2.原地修改数组
将活细胞1变为死细胞-1,保证了math.abs==1为活细胞
将死细胞0变为活细胞2,保证了新的旧的活细胞都大于0