Game of Life I & II
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?
分析: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
00or01. - Notice that
1ststate is independent of2ndstate. - Imagine all cells are instantly changing from the
1stto the2ndstate, at the same time. - Let's count # of neighbors from
1ststate and set2ndstate bit. - Since every
2ndstate is by default dead, no need to consider transition01 -> 00. - In the end, delete every cell's
1ststate 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: whenboard == 1andlives >= 2 && lives <= 3. - Transition
00 -> 10: whenboard == 0andlives == 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的更多相关文章
- 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 ...
- 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 ...
- 函数式Android编程(II):Kotlin语言的集合操作
原文标题:Functional Android (II): Collection operations in Kotlin 原文链接:http://antonioleiva.com/collectio ...
- 统计分析中Type I Error与Type II Error的区别
统计分析中Type I Error与Type II Error的区别 在统计分析中,经常提到Type I Error和Type II Error.他们的基本概念是什么?有什么区别? 下面的表格显示 b ...
- hdu1032 Train Problem II (卡特兰数)
题意: 给你一个数n,表示有n辆火车,编号从1到n,入站,问你有多少种出站的可能. (题于文末) 知识点: ps:百度百科的卡特兰数讲的不错,注意看其参考的博客. 卡特兰数(Catalan):前 ...
- [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 ...
- [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 ...
- [LeetCode] Palindrome Permutation II 回文全排列之二
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
- [LeetCode] Permutations II 全排列之二
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- 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 ...
随机推荐
- .NET获取服务器信息,如服务器版本、IIS等
.NET获取服务器信息,如服务器版本.IIS等 .NET获取服务器信息,如服务器版本.IIS版本.数据库大小.网站系统空间占用大小.网站部署路径等等 .NET获取系统环境信息 #region 返回操作 ...
- dns泛解析漫谈
比如说:http://www.aaa.com/ 指向10.10.1.1,ftp.aaa.com/ 指向10.10.2.2,如果这时候客户访问的是aaa.com或者error.aaa.com (这里er ...
- 10条PHP编程习惯助你找工作
过去的几周对我来说是一段相当复杂的经历.我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐 趣.我从来没有被开除过,所以很难不去想得太多.我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人, ...
- Nginx-tomcat-redis------负载均衡以及session共享
测试环境 Nginx 1.10.1 tomcat 7.0.70 Redis-x64-3.2.100 说明 tomcat 8 和 redis 实现session共享 有问题. 寻找源码 发现tomcat ...
- ASP 编码转换(乱码问题解决)
ASP 编码转换(乱码问题解决) 输出前先调用Conversion函数进行编码转换,可以解决乱码问题. 注,“&参数&”为ASP的连接符,这里面很多是直接调用的数据库表字段,实际使用请 ...
- 全栈工程师是不是必须得会HTML5?
最近看了很多招聘,都要求前端工程师必须得会HTML5.个人觉得只要会了html,HTML5不会太难,不过全栈工程师要求会的太多了 HTML CSS JavaScript HTML 5 CSS 3 都说 ...
- 随鼠标移动tab
<script language="javascript"> function tabChange(obj, id) { var ...
- 使用PHP的五个小技巧
PHP的一些小技巧,比较基础,总结一下,老鸟换个姿势飘过去就是. 1. str_replace str_replace是非常常常常常用的php函数,用于字符串替换,经常看到某些php新人为了替换一批字 ...
- Swift2.1 语法指南——访问控制
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- C 语言sscanf
C语言以sscanf逗号作为分割符 ]={}; ]={}; ]={}; sscanf(],&buf_b[],&buf_b[]); printf("************** ...