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.

Follow up:

  1. 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.
  2. 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?

分析:https://leetcode.com/problems/game-of-life/discuss/73223/Easiest-JAVA-solution-with-explanation

To solve it in place, we use 2 bits to store 2 states:

[2nd bit, 1st bit] = [next state, current state]

- 00  dead (next) <- dead (current)
- 01 dead (next) <- live (current)
- 10 live (next) <- dead (current)
- 11 live (next) <- live (current)
  • In the beginning, every cell is either 00 or 01.
  • Notice that 1st state is independent of 2nd state.
  • Imagine all cells are instantly changing from the 1st to the 2nd state, at the same time.
  • Let's count # of neighbors from 1st state and set 2nd state bit.
  • Since every 2nd state is by default dead, no need to consider transition 01 -> 00.
  • In the end, delete every cell's 1st state by doing >> 1.

For each cell's 1st bit, check the 8 pixels around itself, and set the cell's 2nd bit.

  • Transition 01 -> 11: when board == 1 and lives >= 2 && lives <= 3.
  • Transition 00 -> 10: when board == 0 and lives == 3.

To get the current state, simply do

board[i][j] & 1

To get the next state, simply do

board[i][j] >> 1
 public void gameOfLife(int[][] board) {
if (board == null || board.length == ) return;
int m = board.length, n = board[].length;
for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
int lives = liveNeighbors(board, m, n, i, j);
// In the beginning, every 2nd bit is 0;
// So we only need to care about when will the 2nd bit become 1.
if (board[i][j] == && lives >= && lives <= ) {
board[i][j] = ; // Make the 2nd bit 1: 01 ---> 11
}
if (board[i][j] == && lives == ) {
board[i][j] = ; // Make the 2nd bit 1: 00 ---> 10
}
}
} for (int i = ; i < m; i++) {
for (int j = ; j < n; j++) {
board[i][j] >>= ; // Get the 2nd state.
}
}
} public int liveNeighbors(int[][] board, int m, int n, int i, int j) {
int lives = ;
for (int x = Math.max(i - , ); x <= Math.min(i + , m - ); x++) {
for (int y = Math.max(j - , ); y <= Math.min(j + , n - ); y++) {
lives += board[x][y] & ;
}
}
lives -= board[i][j] & ;
return lives;
}

Game of Life II

In Conway's Game of Life, cells in a grid are used to simulate biological cells. Each cell is considered to be either alive or dead. At each step of the simulation each cell's current status and number of living neighbors is used to determine the status of the cell during the following step of the simulation.

In this one-dimensional version, there are N cells numbered 0 through N-1. The number of cells does not change at any point in the simulation. Each cell i is adjacent to cells i-1 and i+1. Here, the indices are taken modulo N meaning cells 0 and N-1 are also adjacent to eachother. At each step of the simulation, cells with exactly one living neighbor change their status (alive cells become dead, dead cells become alive).

For example, if we represent dead cells with a '0' and living cells with a '1', consider the state with 8 cells: 01100101 Cells 0 and 6 have two living neighbors. Cells 1, 2, 3, and 4 have one living neighbor. Cells 5 and 7 have no living neighbors. Thus, at the next step of the simulation, the state would be: 00011101

 public void solveOneD(int[] board){
int n = board.length;
int[] buffer = new int[n];
// 根据每个点左右邻居更新该节点情况。
for(int i = ; i < n; i++){
int lives = board[(i + n + ) % n] + board[(i + n - ) % n];
if(lives == ){
buffer[i] = (board[i] + ) % ;
} else {
buffer[i] = board[i];
}
}
for(int i = ; i < n; i++){
board[i] = buffer[i];
}
}
 public void solveOneD(int rounds, int[] board){
int n = board.length;
for(int i = ; i < n; i++){
int lives = board[(i + n + ) % n] % + board[(i + n - ) % n] % ;
if(lives == ){
board[i] = board[i] % + ;
} else {
board[i] = board[i];
}
}
for(int i = ; i < n; i++){
board[i] = board[i] >= ? (board[i] + ) % : board[i] % ;
}
}

Game of Life I & II的更多相关文章

  1. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  2. Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II

    题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...

  3. 函数式Android编程(II):Kotlin语言的集合操作

    原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collectio ...

  4. 统计分析中Type I Error与Type II Error的区别

    统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ...

  5. hdu1032 Train Problem II (卡特兰数)

    题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能.    (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...

  6. [LeetCode] Guess Number Higher or Lower II 猜数字大小之二

    We are playing the Guess Game. The game is as follows: I pick a number from 1 to n. You have to gues ...

  7. [LeetCode] Number of Islands II 岛屿的数量之二

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  8. [LeetCode] Palindrome Permutation II 回文全排列之二

    Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...

  9. [LeetCode] Permutations II 全排列之二

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  10. History lives on in this distinguished Polish city II 2017/1/5

    原文 Some fresh air After your time underground,you can return to ground level or maybe even a little ...

随机推荐

  1. List.Sort用法

    treeList.Sort((x, y) => x.SortIndex < y.SortIndex ? -1 : 0);

  2. zabbix安装全过程

    在了解<zabbix硬件.软件需求>之后,在你心里应该有备选的机器.今天开始安装zabbix.zabbix需要LNMP或者LAMP环境.环境的搭建不在本章范围内. LNMP环境配置Linu ...

  3. C#List的排序和简单去重总结

    List集合在开发过程中很常见,经常我们要对该集合进行一系列操作,本文介绍如何将该集合内的元素进行排序,博主制作简单WinForm应用程序进行演示. 首先,我们来看一下c#泛型List提供的Sort方 ...

  4. Spring回调方法DisposableBean接口

    除了自定义的destroy-method.还可以实现DisposableBean接口,来回调bean销毁时候执行的方法,这个接口有一个destroy方法,生命周期是是destroy----bean销毁 ...

  5. php中pdo例子

    下面是从其他博客看到的代码 <?php $dbh = new PDO('mysql:host=localhost;dbname=access_control', 'root', ''); $db ...

  6. [歪谈]我们该怎么正确面对"批评"

    这两天看到网上有类似这样的话题:遇到批评你是如何面对? 其实标题中没有“领导”,并不是专指:遇到“领导”批评你是如何面对? 在IT界(其他行业和领域就不谈了).         批评分三个层面: 1. ...

  7. 【Hadoop】HDFS的运行原理

    博文已转移,请借一步说话http://www.weixuehao.com/archives/596 简介 HDFS(Hadoop Distributed File System )Hadoop分布式文 ...

  8. svg技术(可缩放矢量图形)介绍

    公司里面的产品用图表的地方也比较多,作为平台维护的我,收到几次需求提的建议中包括图表美化的功能,要炫,要3d,立体感,功能要强大等到:平台现有控件都是用的一个开源flash,我对flash虽然会一点但 ...

  9. informatica中元数据管理

    摘自: http://blog.itpub.net/28690368/viewspace-766528/ informaica是一个很强大的ETL工具,WORKFLOW MANAGER负责对ETL调度 ...

  10. 中国天气预报数据API收集

      {"weatherinfo":{"city":"北京","cityid":"101010100" ...