题目描述
题目解析
- 本题是用一个二维数组保存细胞,细胞的死活跟当前数组里的值有关。
- 如果按照正常做法去更新每一个而不使用辅助数组时,就无法满足题目要求,我们应该对数组进行同步更新。
- 我们应该保存两个状态,一个是更新前的状态,一个是更新后的状态。那么我们可以用十位数来保存更新后的状态,个位数保存更新前状态。
- 刚看到这道题第一想法应该是去遍历每个位置周围,存下1的数目来更新,但在评论区借鉴了某位大神的思路,我们可以遍历各个位置,而各个位置活着的细胞会辐射影响周围的位置,使得周围的位置都加上10。
- 而对于判断的问题,我们可以分出细胞存活的情况有两种,分别是更新前活着并且周围只有2或3个活细胞,即21和31的时候和更新前死去但周围刚好有3个活细胞而复活的情况,即30的时候。
题目解答
class Solution {
public void gameOfLife(int[][] board) {
int r=board.length;
int c=board[0].length;
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(board[i][j]%10==1)
check(board,i,j);
}
}
for(int a=0;a<r;a++){
for(int b=0;b<c;b++){
calculate(board,a,b);
}
}
}
//判断细胞是否还存活
private static void calculate(int[][] board,int m,int n){
int value=board[m][n];
//数组所存值为30/31时存活
if(value/10==3) board[m][n]=1;
//数组所存值为21时存活
else if(value/10==2&&value%10==1) board[m][n]=1;
else board[m][n]=0;
}
//往8个方向搜索,不出界就给他加上10
private static void check(int[][] board,int m,int n){
int i,j;
int[] neighbors={
1,0,-1};
for(int a=0;a<3;a++){
for(int b=0;b<3;b++){
i=m;
j=n;
i+=neighbors[a];
j+=neighbors[b];
if(i<0||i>=board.length||j<0||j>=board[0].length||(i==m&&j==n))
continue;
board[i][j]+=10;
}
}
}
}