## LeetCode：Game of Life - 康威生命游戏 原

北风其凉

1、题目名称

Game of Life（康威生命游戏）

2、题目地址

https://leetcode.com/problems/game-of-life

3、题目内容

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):

1. Any live cell with fewer than two live neighbors dies, as if caused by under-population.

2. Any live cell with two or three live neighbors lives on to the next generation.

3. Any live cell with more than three live neighbors dies, as if by over-population..

4. 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.

1. 当前细胞为存活状态时，当周围存活细胞不到2个时， 该细胞变成死亡状态。（模拟生命数量稀少）

2. 当前细胞为存活状态时，当周围有2个或3个存活的细胞时， 该细胞保持原样。

3. 当前细胞为存活状态时，当周围有3个以上的存活细胞时，该细胞变成死亡状态。（模拟生命数量过多）

4. 当前细胞为死亡状态时，当周围恰好有3个存活细胞时，该细胞变成存活状态。 （模拟繁殖）

4、解题方法

``````/**
* @功能说明：LeetCode 289 - Game of Life
* @开发人员：Tsybius2014
* @开发时间：2015年10月8日
*/
public class Solution {

//死亡单位
//存活单位
final int ALIVE = 1;

//变化情况：死亡→死亡
//变化情况：存活→存活
final int ALIVE_TO_ALIVE = 1;
//变化情况：存活→死亡
//变化情况：死亡→存活

/**
* 判断某点在本轮变化前是否是死亡状态
* @param obj
* @return
*/
private boolean isAliveOld(int obj) {
if (obj == ALIVE_TO_ALIVE || obj == ALIVE_TO_DEAD) {
return true;
}
else {
return false;
}
}

/**
* 判断某点在本轮变化后是否是死亡状态
* @param obj
* @return
*/
private boolean isAliveNew(int obj) {
if (obj % 2 == 1) {
return true;
} else {
return false;
}
}

/**
* 生命游戏
* @param board
*/
public void gameOfLife(int[][] board) {

//输入合法性检查
if (board == null) {
return;
}
int height = board.length;
if (height == 0) {
return;
}
int width = board[0].length;
if (width == 0) {
return;
}

//考察所有的点，变化其生命状态
int counter = 0;
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {

//统计周边生命生存情况
counter = 0;
if (i > 0 && j > 0 && isAliveOld(board[i - 1][j - 1])) {
counter++;
}
if (i > 0 && isAliveOld(board[i - 1][j])) {
counter++;
}
if (i > 0 && j < width - 1 && isAliveOld(board[i - 1][j + 1])) {
counter++;
}
if (j > 0 && isAliveOld(board[i][j - 1])) {
counter++;
}
if (j < width - 1 && isAliveOld(board[i][j + 1])) {
counter++;
}
if (i < height - 1 && j > 0 && isAliveOld(board[i + 1][j - 1])) {
counter++;
}
if (i < height - 1 && isAliveOld(board[i + 1][j])) {
counter++;
}
if (i < height - 1 && j < width - 1 && isAliveOld(board[i + 1][j + 1])) {
counter++;
}

//根据指定点周边的生命生存情况决定当前点的变化
if (isAliveOld(board[i][j])) {
if (counter < 2) {
//1.存活单位周边的存活单位少于2个，该单位死亡
} else if (counter == 2 || counter == 3) {
//2.存活单位周边的存活单位有2-3个，该单位继续存活
board[i][j] = ALIVE_TO_ALIVE;
} else {
//3.存活单位周边的存活单位多余3个，该单位死亡
}
} else {
if (counter == 3) {
//4.死亡单位周边的存活单位恰好为3个，该单位变为存活状态
} else {
}
}
}
}

//根据变换后的存活状态，重新赋予每个点的生死情况
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
if (isAliveNew(board[i][j])) {
board[i][j] = ALIVE;
} else {
}
}
}
}
}``````

END

### 北风其凉

C语言做“生命游戏”

Algorithm Gossip: 生命游戏 生命游戏（game of life）为1970年由英国数学家J. H. Conway所提出，某一细胞的邻居包括上、下、左、右、左上、左下、右上与右下相邻的细胞，游戏规则如下： 孤单...

2017/11/30
0
0
4Clojure hard题目－94

4Clojure是一个面向clojure初学者的在线答题网站，问题从易到难，一步步辅助初学者深入了解clojure Game of Life Difficulty: Hard Topics: game The game of life is a cellular automaton...

2012/11/13
333
0

2017/12/19
0
0
h5小游戏——HitRocket

lonelydawn
2016/05/31
935
3

2005/12/13
0
0

echojson
28分钟前
1
0
rabbitmq安装教程

RabbitMQ有Windows与Linux版本的，这里先写Windows版本的安装。 以前安装软件总是在百度上找某某安装教程，结果能按照教程安装好的软件真的不多。想起先前以为大牛说的一句话，去官网按照官网...

em_aaron

7
0
Android 贝塞尔曲线实践——波浪式运动

IamOkay

3
0
Nmap之防火墙/IDS逃逸

Frost729

2
0

java菜分享

8
0