题目描述
解法:
讲一下这里的位操作哈:
一个int占32位,但是0、1只占一位,所有我们可以借助其余的位数来做标记。具体只用借第二位就可以,
rule 1:原来是01,周围细胞存活数小于2,右移一位就是0
rule 2:原来是01,周围细胞存活数等于2或3,01或上10就是11,右移一位就是1
rule 3:原来是01,周围细胞存活数大于3,右移一位就是0
rule 4:原来是00,周围细胞存活数等于3,00或上10就是10,右移一位就是1
真的是个神操作!!
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int dx[] = {-1, 0, 1, -1, 1, -1, 0, 1};
int dy[] = {-1, -1, -1, 0, 0, 1, 1, 1};
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
int sum = 0;
for(int k=0;k<8;k++)
{
int nx = i + dx[k];
int ny = j + dy[k];
if((nx>=0 && nx<board.size()) && (ny>=0 && ny<board[0].size()))
sum += (board[nx][ny]&1); // 只累加最低位
}
if(board[i][j]==1)
{
if(sum==2 || sum==3) board[i][j] |= 2; // 使用第二个bit标记是否存活
}
else
{
if(sum==3) board[i][j] |= 2;
}
}
}
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
board[i][j] >>= 1;
}
}
};