[email protected] [289] Game of Life

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

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?

struct neighbor{
    int dies, lives;
    neighbor() {dies = 0; lives = 0;}
    neighbor(int d, int l): dies(d), lives(l) {}
};
class Solution {
public:
    bool check(int m, int n, int a, int b) {
        if(a<0 || a>=m || b<0 || b>=n) return false;
        return true;
    }
    void gameOfLife(vector<vector<int>>& board) {
        if(board.size() == 0) return;

        int m = board.size(), n = board[0].size(), ni, nj;
        int dir[8][2] = {{-1,0},{-1,-1},{-1,1},{0,-1},{0,1},{1,0},{1,-1},{1,1}};
        vector<vector<int> > res(m, vector<int>(n));
        neighbor neg[m][n];

        for(int i=0;i<m;++i) {
            for(int j=0;j<n;++j) {
                for(int k=0;k<8;++k) {
                    ni = i + dir[k][0]; nj = j + dir[k][1];
                    if(check(m, n, ni, nj)) {
                        if(board[ni][nj] == 1) ++neg[i][j].lives;
                        else ++neg[i][j].dies;
                    }
                }
            }
        }

        for(int i=0;i<m;++i) {
            for(int j=0;j<n;++j) {
                if(board[i][j] && neg[i][j].lives < 2) res[i][j] = 0;
                else if(board[i][j] && (neg[i][j].lives == 2 || neg[i][j].lives == 3)) res[i][j] = 1;
                else if(board[i][j] && neg[i][j].lives > 3) res[i][j] = 0;
                else if(!board[i][j] && neg[i][j].lives == 3) res[i][j] = 1;
                else res[i][j] = board[i][j];
            }
        }

        board = res;
    }
};

leetcode 289: Game of Life

时间: 2024-12-18 07:11:50

[email protected] [289] Game of Life的相关文章

$*和[email&#160;protected]之间区别代码分析

#!/bin/bash set 'apple pie' pears peaches for i in $*           /*单引号被去掉,循环单个字符输出*/ do echo $i done [[email protected] Ex_14.02-14.31]# sh 14-14-1 apple pie pears peaches -------------------------------------------------------------- #!/bin/bash set

[email&#160;protected]一个高效的配置管理工具--Ansible configure management--翻译(六)

无书面许可请勿转载 高级playbook Finding files with variables All modules can take variables as part of their arguments by dereferencing them with {{ and }} . You can use this to load a particular file based on a variable. For example, you might want to select a

【转载】 ERROR 1045 (28000): Access denied for user [email&#160;protected] (using password: NO)

来自:http://www.jb51.net/LINUXjishu/10981.html 错误描述: Mysql中添加用户之后可能出现登录时提示ERROR 1045 (28000): Access denied for user的错误.删除user.user中值为NULL的,或更新NULL为test 1)delete from user where user is NULL 2)update user set user='test' where user is NULL.意外的情况: 如果上述方

[[email&#160;protected]] Omit catch error block if not needed

From [email protected], you can omit catch error block. Before: try { throw new Error('whatever'); } catch(err) { console.log(err) } Now: try { throw new Error('whatever'); } catch { console.log("error happened") } It is just a syntax sugar, if

[email&#160;protected]动态代理-类加载器

一.测试单元     概述:用于测试JAVA代码的工具类,已内置在Eclipse中;     格式:         1.在方法的上面添加@Test;         2.对被测试的方法的要求:权限-public;返回值-void;参数-空参         [email protected]:在@Test标注的方法前执行,可以用于初始化;           @After:在@Test标注的方法后执行,可以用于释放资源; 二.注解     概述:java的一种数据类型,和类/接口在同一级别  

git push报错error: failed to push some refs to &#39;[email&#160;protected]:

$ git push -u origin master To [email protected]:xxx/xxx.git ! [rejected] master -> master (fetch first) error: failed to push some refs to '[email protected]:xxx/xxx.git' hint: Updates were rejected because the remote contains work that you do hint:

Https方式使用[email&#160;protected]设置密码的方式

62561_silentboy Zoker3 years ago member https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credential.helper cache 如果想自己设置时间,可以这样做: git config credential.helper 'cache --timeout=3600' 这样就设置一个小时之后失效 长期存储密码: git

mysql Access denied for user [email&#160;protected]错误解决方法总结(转)

mysql Access denied for user [email protected]错误解决方法总结(转) mysql Access denied for user \'root\'@\'localhost\'”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下. 错误代码 1045 Access denied for user 'root'@'localhost' (using password:YES) 解决办法是重新设置root用户密码,

解决[email&#160;protected]&#39;s password:localhost:permission denied,please try again

背景:在装完Hadoop及jdk之后,在执行start-all.sh的时候出现 [email protected]'s password:localhost:permission denied,please try again 可是,我记得当时设置的密码是对的,无论怎么输都不对 解决方法:在出现上述问题后,输入 [cpp] view plain copy sudo passwd 然后,会输入新的密码,设置之后,再重新格式化一下namenode,最后执行start-all.sh,OK. 解决[em