1、原地修改
我们可以按照要求,直接在矩阵进行原地修改。但是我们进行原地修改时需要考虑修改后的元素对后续的判断产生影响。因此我们可以使用中间状态-1和2来代表现有活细胞即将死亡和死亡细胞准备复活的两种特殊状态。并在最终遍历整个矩阵,将特殊状态修改为新时刻下的状态。
class Solution {
public:
void gameOfLife(vector<vector<int>> &board) {
int row = board.size(), col = board[0].size();
vector<int> dir{-1, 0, 1};
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
int neighbor = 0;
for (int rpos: dir) {
for (int cpos: dir) {
if (rpos == 0 && cpos == 0) {
continue;
} else if (i + rpos >= 0 && i + rpos < row && j + cpos >= 0 && j + cpos < col && (board[i + rpos][j + cpos] == 1 || board[i + rpos][j + cpos] == -1)) {
++neighbor;
}
}
}
if (board[i][j] == 1 && (neighbor < 2 || neighbor > 3)) {
board[i][j] = -1;
} else if (board[i][j] == 0 && neighbor == 3) {
board[i][j] = 2;
}
}
}
for (int i = 0; i < row; ++i) {
for (int j = 0; j < col; ++j) {
if (board[i][j] <= 0) {
board[i][j] = 0;
} else {
board[i][j] = 1;
}
}
}
}
};