题目链接
生命游戏
题目描述
注意点
- board[i][j] 为 0 或 1
- 细胞的出生和死亡是同时发生的
- 返回下一个状态
解答思路
- 根据规则更新细胞下一次的状态,但是要保证如果更新了某个细胞的状态,在其他细胞由该细胞状态决定状态时,应该取当前的状态(而非下一次的状态)
- 如果想要原地算法解决本题,关键是要找到哪些细胞由0->1或1->0,且不能直接进行更新,而是应该额外用一个状态来标记该状态,本次解法使用2表示由0->1,用3表示由1->0,最终再根据这些状态更新board即可
代码
class Solution {
public void gameOfLife(int[][] board) {
int[][] direction = {
{-1, -1}, {-1, 0}, {-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1, 1}};
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
int sum = 0;
for (int x = 0; x < direction.length; x++) {
sum += isAliveCell(board, i + direction[x][0], j + direction[x][1]);
}
if (board[i][j] == 0 && sum == 3) {
board[i][j] = 2;
}
if (board[i][j] == 1 && (sum < 2 || sum > 3)) {
board[i][j] = 3;
}
}
}
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < board[0].length; j++) {
if (board[i][j] == 2) {
board[i][j] = 1;
}
if (board[i][j] == 3) {
board[i][j] = 0;
}
}
}
}
public int isAliveCell(int[][] board, int i, int j) {
if (i < 0 || j < 0 || i >= board.length || j >= board[0].length) {
return 0;
}
if (board[i][j] == 1 || board[i][j] == 3) {
return 1;
}
return 0;
}
}
关键点