问题描述:
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
- 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
- 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
- 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
- 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。
思路:
- 由于更新下一次状态是同时进行的,所以需要引入一个数组,拷贝元数组的值,用于更新状态时操作。
- 分别对某一位置的八个相邻位置的值进行统计,然后按要求在原数组中进行该位置的状态更新。
源代码
class Solution {
public void gameOfLife(int[][] board) {
if(board.length != 0){
int a = board.length, b = board[0].length;
int[][] copyit = new int[a][b];
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
copyit[i][j] = board[i][j];
}
}
for(int i = 0; i < a; i++){
for(int j = 0; j < b; j++){
int mid = 0;
if(i > 0 && copyit[i-1][j] == 1) mid++;
if(j > 0 && copyit[i][j-1] == 1) mid++;
if(i > 0 && j > 0 && copyit[i-1][j-1] == 1) mid++;
if(i > 0 && j < b-1 && copyit[i-1][j+1] == 1) mid++;
if(j < b-1 && copyit[i][j+1] == 1) mid++;
if(i < a-1 && copyit[i+1][j] == 1) mid++;
if(i < a-1 && j > 0 && copyit[i+1][j-1] == 1) mid++;
if(i < a-1 && j < b-1 && copyit[i+1][j+1] == 1) mid++;
if(copyit[i][j]==0 && mid == 3) board[i][j] = 1;
if(copyit[i][j] == 1){
if(mid==2 || mid == 3) board[i][j] = 1;
else board[i][j] = 0;
}
}
}
}
}
}