Medium
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:
m == board.length
n == board[i].length
1 <= m, n <= 25
board[i][j]
is 0
or 1
.Follow up:
/**
* Do not return anything, modify board in-place instead.
*/
function gameOfLife(board: number[][]): void {
const m = board.length
const n = board[0].length
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
const liveNeighbors = countLives(board, i, j, m, n)
if (board[i][j] === 0 && liveNeighbors === 3) {
board[i][j] = 2
} else if (board[i][j] === 1 && (liveNeighbors === 2 || liveNeighbors === 3)) {
board[i][j] = 3
}
}
}
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
board[i][j] >>= 1
}
}
}
function countLives(board: number[][], i: number, j: number, m: number, n: number): number {
let lives = 0
for (let r = Math.max(0, i - 1); r <= Math.min(m - 1, i + 1); r++) {
for (let c = Math.max(0, j - 1); c <= Math.min(n - 1, j + 1); c++) {
lives += board[r][c] & 1
}
}
lives -= board[i][j] & 1
return lives
}
export { gameOfLife }