Game of Life 解答

Question

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?

Solution

这题的关键在于合适的编码。我们用两位来代表每个cell的状态。

after  prev

1    0  以前是dead,经过一次update后为live

1    1  以前是live,经过一次update后为live

0    1  以前是live,经过一次update后为dead

0    0  以前是dead,经过一次update后为dead

由此我们看到取得prev位可以用%操作,取得after位可以用/操作。

因此我们遍历两遍2维数组。第一遍是将所有元素编码成上述两位形式。第二遍是除法操作,得到after。

Time complexity O(mn), space cost O(1)

 1 public class Solution {
 2     public void gameOfLife(int[][] board) {
 3         int[][] directions = {{-1,0},{1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
 4         int m = board.length, n = board[0].length;
 5         for (int i = 0; i < m; i++) {
 6             for (int j = 0; j < n; j++) {
 7                 int prev = board[i][j];
 8                 int liveCount = 0, deadCount = 0;
 9                 for (int k = 0; k < 8; k++) {
10                     int newX = i + directions[k][0];
11                     int newY = j + directions[k][1];
12                     if (newX < 0 || newX >= m || newY < 0 || newY >= n) {
13                         continue;
14                     }
15                     if (board[newX][newY] % 2 == 1) {
16                         liveCount++;
17                     }
18                 }
19                 if (prev == 0) {
20                     if (liveCount == 3) {
21                         board[i][j] += 2;
22                     }
23                 } else {
24                     if (liveCount == 2 || liveCount == 3) {
25                         board[i][j] += 2;
26                     }
27                 }
28             }
29         }
30         for (int i = 0; i < m; i++) {
31             for (int j = 0; j < n; j++) {
32                 board[i][j] = board[i][j] / 2;
33             }
34         }
35     }
36 }
时间: 2024-10-06 23:03:04

Game of Life 解答的相关文章

PHP常见问题及解答

当作PHP学习时,总是会在baidu上查很多的例如开发环境的选择呀,PHP好不好呀!或者是不是转学JAVA,或是.NET等: 首先本人是从2010年下半年开始报名学的PHP(IN Guangzhou),每周一天学了近6个月左右,从最基础的HTML,CSS,DIV,JAVASCRIPT,AJAX,PHP,然后学二次开发:闲暇之余还开通了一个个人blog( PHP wordpress); 由于个人工作原因,这几年放了一段时间未动PHP了,今年开始又自学了.NET; ---目的就想业余做一份兼职,锻炼

微信送礼物投票系统的详细解答

就目前来说,市场上的第三方微信投票系统种类很多,功能不一鱼龙混杂,功能很多的情况下有一些细微的区别,对于用户来说选择有一定的难度,下面我就来简单介绍一下微信投票活动大家经常关注的16个问题,对此进行详细的解答:只要能同时包括这个些功能的系统,通常都能够很好的满足活动举办方的要求,活动良好的用户体验! Q1.该投票系统可以设置每个微信用户投票次数吗? A3:可以的,可以设置一次活动每个微信用户的投票数,可设置每个微信用户每天的投票数!并且取消关注自动减掉此用户投票的所有记录,做到了自动减票的功能.

2014马哥Linux0217中对0214三题的解答

前几天在做2014马哥Linux0214的作业的时候,发现其实这三题在0217中有解答,当然觉得马哥比自己写得好太多,所以忍不住要把马哥的答案贴出来,以供自己学习. 第一题:写一个脚本,用for循环实现显示/etc/init.d/functions./etc/rc.d/rc.sysinit./etc/fstab有多少行 #!/bin/bash for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab;do line

JAVA常见面试题及解答-java开发

JAVA常见面试题及解答 Java的垃圾回收总结  浅谈Java中的内部类 1)transient和volatile是java关键字吗? 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class T { transient int a;  //不需要维持 int b;  //需要维持 } 这里,如果T类的一个对象写入一个持久的存储区域,a的内容不被保存,但b的将被保存. volatile修饰符告诉编译器被volatile修饰的变量可以被程序的其他部分改变.在多

软件工程之路—解答数据流图

数据流图的做法其实很简单,题的类型有很多,但是万变不离其宗,我们先看一下考试的类型: 1.确定实体(数据源)名称 2.确定数据文件(数据存储)的名称 3.确定加工的名称 4,.找出缺少的数据流 其实,这就是在考查,数据流图的画法. 也就是说,根据题中系统的系列描述,能够画出数据流图,那么,这题能拿满分就是板上钉钉的事儿. 首先看一下一般流程图的画法 (1)首先画系统的输入输出,即先画顶层数据流图.顶层流图只包含一个加工,用以表示被开发的系统,然后考虑该系统有哪些输入数据.输出数据流.顶层图的作用

在axure中实现商品数量加减效果,原型库网站讲师-金乌 解答同学问

有同学在群里提问,如何使用axure制作商品数量增加减少效果,见GIF图.虽然属于初级教程,但很多同学还是小白新手阶段,所以特地录制了详细的视频讲解,供大家学习参考! 该教程由原型库网站录制http://www.yuanxingku.com转载请注明出处! 在axure中实现商品数量加减效果,原型库网站讲师-金乌 解答同学问,布布扣,bubuko.com

解答zabbix在configure时候遇到的问题(CentOS)

zabbix在configure时候遇到的问题(CentOS)为你解答: 在CentOS系统中,安装zabbix进行configure时会遇到以下4个主要问题 ./configure --enable-server --enable-agent --with-mysql --with-net-snmp --with-jabber --with-libcurl 1 configure: error: MySQL library not found the problem is not instal

C++ Primer 第四版课后练习解答 习题1.1

注意:本随笔是在<C++Primer(第四版)习题解答(完整版)>中直接抄录的.此处主要是便于本人以后反复阅读. 习题1.1 查看所用的编译器文档,了解它所用的文件命名规范.编译并运行本节的main程序. [解答] 一般而言,C++编译器要求编译的程序保存在文件中.C++程序一般涉及两类文件:头文件和源文件.大多数系统中,文件的名字由文件名和文件后缀(又称扩展名)组成.文件后缀通常表明文件的类型,如头文件的后缀可以是.h或.hpp等:源文件和后缀可以是.cc或.cpp等,具体的后缀与使用的编译

腾讯课堂目标2017高中数学联赛基础班-2作业题解答-10

课程链接:目标2017高中数学联赛基础班-2(赵胤授课) 1. 设 $a_1, a_2, \cdots, a_n\in\mathbf{R}$, 证明: $$\sqrt[3]{a_1^3 + a_2^3 + \cdots + a_n^3} \le \sqrt{a_1^2 + a_2^2 + \cdots + a_n^2}.$$ 解答: $$\left(\sum a_i^3\right)^2 \le \sum a_i^2 \cdot \sum a_i^4 \le \sum a_i^2 \cdot \

厦门大学2016年高等代数考研试题参考解答

张祖锦第7卷第488期厦门大学2016年高等代数考研试题参考解答[5932—5953] (link, 视频讲解) 题目: http://bbs.sciencenet.cn/thread-3092647-1-1.html