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:
class Solution {
companion object {
var dim: Array<IntArray> = arrayOf(
intArrayOf(1, 0),
intArrayOf(0, 1),
intArrayOf(-1, 0),
intArrayOf(0, -1),
intArrayOf(1, 1),
intArrayOf(1, -1),
intArrayOf(-1, 1),
intArrayOf(-1, -1),
)
}
fun gameOfLife(board: Array<IntArray>) {
for (i in board.indices) {
for (j in board[0].indices) {
val com = compute(board, i, j)
if (board[i][j] == 0) {
if (com == 3) {
board[i][j] = -1
}
} else if (board[i][j] == 1 && (com < 2 || com > 3)) {
board[i][j] = 2
}
}
}
update(board)
}
private fun update(board: Array<IntArray>) {
for (i in board.indices) {
for (j in board[0].indices) {
if (board[i][j] == -1) {
board[i][j] = 1
} else if (board[i][j] == 2) {
board[i][j] = 0
}
}
}
}
private fun compute(board: Array<IntArray>, r: Int, c: Int): Int {
var ret: Int = 0
for (arr in dim) {
val row = arr[0] + r
val col = arr[1] + c
if (row >= 0 && row < board.size && col >= 0 && col < board[0].size &&
(board[row][col] == 1 || board[row][col] == 2)
) {
ret++
}
}
return ret
}
}