按照 规则 修改二维数组元素值。
二维数组中只有1和0, 1表示live, 2表示dead.
规则如下:
1. 一个存活的cell,它有小于两个邻居dead,那么它在下一代die.
2. 一个存活的cell,它有2到3个邻居live,那么它在下一代也live.
3. 一个存活的cell,它有多于3邻居die,那么它在下一代也die.
4. 一个dead的cell,它有3个邻居live,那么它在下一代也live.
注意:数组中的每个元素同时进入下一代,没有先后顺序问题。
思考:题目的重点在于不能修改一个元素,用修改后的结果影响到下一代。解决方法有两种,(方法1)使用辅助空间,分两步走,先统计每个元素的邻居的个数放在辅助空间中,再根据记录的邻居个数,更新原数组。(方法2)不需要辅助空间,直接在原数组上修改,用非0和1元素替代,这样就不会和原始元素值混淆了。
解法: 不用辅助空间
void gameOfLife(vector<vector<int>>& board) {
int rows = board.size();
int cols = board[0].size();
int neighbors[3] = {0, 1, -1};
// live -> die -1
// die -> live 2
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
int live_count = 0;
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if (!(neighbors[i] == 0 && neighbors[j] ==0)) {
int n_r = r + neighbors[i];
int n_c = c + neighbors[j];
if ((n_r >= 0 && n_r < rows) &&
(n_c >= 0 && n_c < cols) &&
abs(board[n_r][n_c]) == 1) {
++live_count;
}
}
}
}
if (board[r][c] == 1 && (live_count < 2 || live_count > 3)) {
board[r][c] = -1;
}
if (board[r][c] == 0 && live_count == 3) {
board[r][c] = 2;
}
}
}
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
if (board[r][c] == -1) {
board[r][c] = 0;
} else if (board[r][c] == 2) {
board[r][c] = 1;
}
}
}
}