一个 int 有 32 bit,输入数据只用了一个 bit,所以我们可以利用其他空闲的bit位进行“原地修改”。
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int dx[] = { 0,0,-1,1,-1,-1,1,1 };//上、下、左、右、左上、左下、右上、右下
int dy[] = { 1,-1,0,0,1,-1,1,-1 };
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
{
int count_alive = 0;
for (int k = 0; k < 8; k++)
{
int new_x = i + dx[k];
int new_y = j + dy[k];
if (!(new_x >= 0 && new_x < board.size() && new_y >= 0 && new_y < board[0].size()))continue;
if ((board[new_x][new_y] & 1) == 1)//只判断第一个bit!!!很关键// 这里不能直接加board[x][y],因为 board[x][y] 的第二个bit是可能有值的
count_alive += (board[new_x][new_y] & 1);//只累加第一个bit!!!很关键
}
if (count_alive < 2 && board[i][j] == 1)
{
board[i][j] |= 0; //第二个bit为0
}
else if ((count_alive == 2 || count_alive == 3) && board[i][j] == 1)
{
board[i][j] |= 2;//使第二个bit为1
}
else if (count_alive > 3 && board[i][j] == 1)
{
board[i][j] |= 0;//使第二个bit为0
}
else if (count_alive == 3 && board[i][j] == 0)
{
board[i][j] |= 2;//使第二个bit为1
}
}
for (int i = 0; i < board.size(); i++)
for (int j = 0; j < board[0].size(); j++)
{
board[i][j] >>= 1;//数组的所有元素同时右移1位,是原来的第二个bit成为第一个bit
}
}
};