🌗 289. 生命游戏
2022年10月10日
- algorithm
🌗 289. 生命游戏
难度: 🌗
问题描述
解法
class Solution {
public void gameOfLife(int[][] board) {
// 思路:
// 遍历每个元素,设置 0 -> 1 时 -1
// 设置 1 -> 0 时,-2
// 最后将 -1 | -2 变为实际要变为的值
int row = board.length;
int col = board[0].length;
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
int count = 0; // 统计该细胞周围活细胞数
for(int n = j - 1; n <= j + 1; n ++) {
if(isValid(board, row, col, i - 1, n)) {
count ++; // 上一行的 3 个元素
}
}
if(isValid(board, row, col, i, j - 1)) {
count ++;
}
if(isValid(board, row, col, i, j + 1)) {
count ++;
}
for(int n = j - 1; n <= j + 1; n ++) {
if(isValid(board, row, col, i + 1, n)) {
count ++; // 下一行的 3 个元素
}
}
if(board[i][j] == 1) {
// 该细胞为活细胞
if(count != 2 && count != 3) {
// 需要变色
board[i][j] = -2;
}
// System.out.println(i + " : " + j + " " + count);
}
if(board[i][j] == 0) {
if(count == 3) {
board[i][j] = -1;
// System.out.println(i + " : " + j + " " + count);
}
}
}
}
// 再次遍历,将 -1 | -2 的变为实际值
for(int i = 0; i < row; i ++) {
for(int j = 0; j < col; j ++) {
if(board[i][j] == -1) {
board[i][j] = 1;
} else if(board[i][j] == -2) {
board[i][j] = 0;
}
}
}
}
private boolean isValid(int[][] board, int row, int col, int i, int j) {
if(i < 0 || j < 0) {
return false;
}
if(i >= row || j >= col) {
return false;
}
if(board[i][j] == -2 || board[i][j] == 1) {
return true;
}
return false;
}
}