二维网格遍历注意使用技巧让代码可读性强。
原始的思路是使用一个二维数组进行更新,当全部更新完以后,复制这个二维数组到原来的数组上。
可不可以优化,不使用额外的空间,答案是可以的
细胞的状态如下: 活->活 1
活->死 -1
死->活 2
死->死 0
由于特殊的规则,只有原来附近是活的细胞有意义,所以只需要将1和-1当作一种情况,就可以在原地进行更新
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int n = board.size(), m = board[0].size();
int neighbor[] = {0,1,-1};
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
int liveNeighbor = 0;
for(int k=0;k<3;k++){
for(int l=0;l<3;l++){
if(k==0&&l==0) continue;
int x = i + neighbor[k];
int y = j + neighbor[l];
if(x>=0&&x<n&&y>=0&&y<m&&abs(board[x][y])==1) liveNeighbor++;
}
}
if(board[i][j]==1&&(liveNeighbor<2||liveNeighbor>3)) board[i][j] = -1;
if(board[i][j]==0&&liveNeighbor==3) board[i][j] = 2;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(board[i][j]>0) board[i][j] = 1;
else board[i][j] = 0;
}
}
}
};