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):
Follow up:
题目中说最好是in-place,因为board是int型的,所以要区分四种状态(dead是0,live是1):
dead->live 01
dead->dead 00
live->dead 10
live->live 11
或者直接用0,1,2,3四个数字表示四种状态都可以,然后通过移位进行结果的更新。
public void gameOfLife(int[][] board) {
if (board == null || board.length == 0 || board[0] == null
|| board[0].length == 0)
return;
int m = board.length;
int n = board[0].length;
// 判断每个点,下一时刻的状态
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int x = getLiveNum(board, i, j);
if (board[i][j] == 0) {
if (x == 3)
board[i][j] += 10;
} else {
if (x == 2 || x == 3)
board[i][j] += 10;
}
}
}
// 更新每个点的状态
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
board[i][j] /= 10;
}
}
}
// 获取board[x][y]邻居live的数量
private int getLiveNum(int[][] board, int x, int y) {
int c = 0;
for (int i = x - 1; i <= x + 1; i++) {
for (int j = y - 1; j <= y + 1; j++) {
if (i < 0 || j < 0 || i > board.length - 1
|| j > board[0].length - 1 || (i == x && j == y))
continue;
if (board[i][j] % 10 == 1)
c++;
}
}
return c;
}
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。