289. Game of Life

Difficulty:
Related Topics:
Similar Questions:

Problem

According to Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."

The board is made up of an m x n grid of cells, where each cell has an initial state: live (represented by a 1) or dead (represented by a 0). Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):

The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously. Given the current state of the m x n grid board, return the next state.

  Example 1:

Input: board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
Output: [[0,0,0],[1,0,1],[0,1,1],[0,1,0]]

Example 2:

Input: board = [[1,1],[1,0]]
Output: [[1,1],[1,1]]

  Constraints:

  Follow up:

Solution

/**
 * @param {number[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var gameOfLife = function(board) {
    for (var i = 0; i < board.length; i++) {
        for (var j = 0; j < board[i].length; j++) {
            var count = countLiveneighbors(board, i, j);
            if (board[i][j] === 1) {
                if (count < 2 || count > 3) {
                    board[i][j] = 2;
                }
            } else {
                if (count === 3) {
                    board[i][j] = 3;
                }
            }
        }
    }
    for (var i = 0; i < board.length; i++) {
        for (var j = 0; j < board[i].length; j++) {
            if (board[i][j] === 2) {
                board[i][j] = 0;
            } else if (board[i][j] === 3) {
                board[i][j] = 1;
            }
        }
    }
};

var countLiveneighbors = function(board, i, j) {
    var directions = [
        [0, 1],
        [0, -1],
        [1, 0],
        [-1, 0],
        [1, 1],
        [1, -1],
        [-1, 1],
        [-1, -1],
    ];
    var count = 0;
    for (var m = 0; m < directions.length; m++) {
        var [y, x] = directions[m];
        if (!board[i + y]) continue;
        if (board[i + y][j + x] === 1 || board[i + y][j + x] === 2) {
            count += 1;
        }
    }
    return count;
};

Explain:

nope.

Complexity: