https://leetcode.com/problems/game-of-life/
1. 思路
使用naive的解法遍历数组内的每个元素,但是改变in-place地改变每个位置的值后,就会影响后面位置的next generation判断。
解决方法是把next generation结果放在二进制数的第二位,不影响当前的状态(0 1都存储在第1位),采用&1操作取得当前的状态,采用>>1操作获得next generation结果
2. AC代码
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int m = board.size();
int n = board[0].size();
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
int cnt = 0;
for(int a=max(0, i-1); a<=min(i+1, m-1); a++){
for(int b=max(0, j-1); b<=min(j+1, n-1); b++){
if(a==i && b==j) continue;
if((board[a][b]&1)==1) cnt++;
}
}
if((board[i][j]&1) == 1 && (cnt==2 or cnt==3)) board[i][j] |= 2;
if((board[i][j]&1) == 0 && cnt==3) board[i][j] |= 2;
}
}
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
board[i][j] >>= 1;
}
}
}
};