**Problem:**

According to the 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.”

Given a *board* with *m* by *n* cells, each cell has an initial state *live* (1) or *dead* (0). Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):

- Any live cell with fewer than two live neighbors dies, as if caused by under-population.
- Any live cell with two or three live neighbors lives on to the next generation.
- Any live cell with more than three live neighbors dies, as if by over-population..
- Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.

Write a function to compute the next state (after one update) of the board given its current state.

**Follow up**:

- Could you solve it in-place? Remember that the board needs to be updated at the same time: You cannot update some cells first and then use their updated values to update other cells.
- In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches the border of the array. How would you address these problems?

**Credits:**

Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

**Solution:**

boring

public class Solution { int[][] myBoard, newBoard; public void gameOfLife(int[][] board) { myBoard = board; newBoard = new int[board.length][board[0].length]; for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { update(i, j); } } for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { board[i][j] = newBoard[i][j]; } } } private void update(int i, int j) { int live = countNeighbors(i, j); if (myBoard[i][j] > 0) { if (live < 2) newBoard[i][j] = 0; else if (live < 4) newBoard[i][j] = 1; else newBoard[i][j] = 0; } else if (live == 3) newBoard[i][j] = 1; } private int countNeighbors(int i, int j) { int count = 0; if (i - 1 >= 0) { if (myBoard[i-1][j] > 0) count++; if (j - 1 >= 0) { if (myBoard[i-1][j-1] > 0) count++; } if (j + 1 < myBoard[0].length) { if (myBoard[i-1][j+1] > 0) count++; } } if (i + 1 < myBoard.length) { if (myBoard[i+1][j] > 0) count++; if (j - 1 >= 0) { if (myBoard[i+1][j-1] > 0) count++; } if (j + 1 < myBoard[0].length) { if (myBoard[i+1][j+1] > 0) count++; } } if (j - 1 >= 0) { if (myBoard[i][j-1] > 0) count++; } if (j + 1 < myBoard[0].length) { if (myBoard[i][j+1] > 0) count++; } return count; } }