跳到主要内容

289 生命游戏

https://leetcode.cn/leetbook/read/top-interview-questions-hard/xwk53e/

cost: 31m39s

class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
enum State {
DeadDead = 0b1000,
DeadAlive = 0b1100,
AliveDead = 0b1001,
AliveAlive = 0b1101,
};
for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
auto [deadCnt, aliveCnt] = this->countDeadAndAlive(board, i, j);
if (board[i][j] == 1) {
if (aliveCnt < 2) {
board[i][j] |= 0b1000;
} else if (aliveCnt == 2 || aliveCnt == 3) {
board[i][j] |= 0b1100;
} else if (aliveCnt > 3) {
board[i][j] |= 0b1000;
}
} else {
if (aliveCnt == 3) {
board[i][j] |= 0b1100;
}
}
}
}

for (int i = 0; i < board.size(); i++) {
for (int j = 0; j < board[0].size(); j++) {
board[i][j] = (board[i][j] >> 2) & 0b01;
}
}
}

private:
std::tuple<int, int> countDeadAndAlive(vector<vector<int>>& board, int i,
int j) {
int deadCnt = 0;
int aliveCnt = 0;
for (int k = std::max(0, i - 1);
k <= std::min(i + 1, static_cast<int>(board.size() - 1)); k++) {
for (int n = std::max(0, j - 1);
n <= std::min(j + 1, static_cast<int>(board[0].size() - 1));
n++) {
if (k == i && n == j) {
continue;
}
int tmp = board[k][n] & 0b11;
if (tmp == 0) {
deadCnt++;
} else if (tmp == 1) {
aliveCnt++;
}
}
}
return {deadCnt, aliveCnt};
}
};