🌗 289. 生命游戏

吞佛童子2022年10月10日
  • algorithm
  • Array
大约 1 分钟

🌗 289. 生命游戏

难度: 🌗

问题描述

img_15.png


解法

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;
    }
}

输出

img_14.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou