题目

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?

分析

基于一个生命游戏的题目,游戏介绍

生死判断条件:

  1. 一個活的格子若只有一個或沒有鄰居, 在下一秒將因寂寞而亡;
  2. 一個活的格子若有四個或四個以上的鄰居, 在下一秒將因拥擠而亡;
  3. 一個活的格子若有二個或三個鄰居, 在下一秒將継續活著;
  4. 一個死的格子若有三個鄰居, 在下一秒將活過來;

题目要求inplace实现,不允许额外申请空间。

若是不考虑占用空间,我们很容易可以解决该问题。首先,保存原始棋盘用于计算邻居live状态的数目。然后依据条件修改board每个cell的状态即可。

若是不允许申请空间,我们必须在不改变原始棋盘状态的情况下,记录出每个cell应该怎么变化;

使用不同数值(十进制)代表状态 0 :dead; 10 :dead—>live; 11:live—>live; 1:live;

具体实现见代码!

AC代码

class Solution {
public:
//方法一:复制原来棋盘,空间复杂度为O(n)
void gameOfLife1(vector<vector<int>>& board) {
if (board.empty())
return; //求出所给定棋盘的行列
int m = board.size(), n = board[0].size(); vector<vector<int>> tmp(board.begin(), board.end());
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
int count = getLiveNum(tmp, i, j);
if (board[i][j] == 0)
{
//dead状态
if (count == 3)
board[i][j] = 1; //dead —> live
}//if
else{
//live状态
if (count > 3)
{
board[i][j] = 0; //live—>dead
}//if
//若是count == 2 || count == 3 则live—>dead,board[i][j]值不变
}//else
}//for
}//for
return;
} //方法二:inplace 使用不同数值(十进制)代表状态 0 :dead; 10 :dead—>live; 11:live—>live; 1:live;
void gameOfLife(vector<vector<int>>& board) {
if (board.empty())
return; //求出所给定棋盘的行列
int m = board.size(), n = board[0].size();
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
int count = getLiveNum(board, i, j);
if (board[i][j] == 0)
{
//dead状态
if (count == 3)
board[i][j] += 10; //dead —> live
}
else{
//live状态
if (count == 2 || count == 3)
{
board[i][j] += 10; //live—>live
}//if
//若是count>=4 则live—>dead,board[i][j]值不变
}//else
}//for
}//for
//更新状态
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
board[i][j] /= 10;
}//for
}//for
return;
} //计算位于(r,c)邻居,live状态的数量
int getLiveNum(vector<vector<int>> &board, int x, int y)
{
int count = 0;
for (int i = x - 1; i <= x + 1; ++i)
{
for (int j = y - 1; j <= y + 1; ++j)
{
if (i < 0 || j < 0 || i >= board.size() || j >= board[x].size() || (x == i && j == y))
{
continue;
}
else{
if (board[i][j] % 10 == 1)
++count;
}//else
}//for
}//for
return count;
} };

GitHub测试程序源码

LeetCode(289)Game of Life的更多相关文章

  1. LeetCode(275)H-Index II

    题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...

  2. LeetCode(220) Contains Duplicate III

    题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  3. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  4. LeetCode(122) Best Time to Buy and Sell Stock II

    题目 Say you have an array for which the ith element is the price of a given stock on day i. Design an ...

  5. LeetCode(116) Populating Next Right Pointers in Each Node

    题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...

  6. LeetCode(113) Path Sum II

    题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given ...

  7. LeetCode(107) Binary Tree Level Order Traversal II

    题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...

  8. LeetCode(4)Median of Two Sorted Arrays

    题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  9. Leetcode(1)两数之和

    Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一 ...

随机推荐

  1. 066 Plus One

    给定一个非负整数组成的非空数组,给整数加一.可以假设整数不包含任何前导零,除了数字0本身.最高位数字存放在列表的首位.详见:https://leetcode.com/problems/plus-one ...

  2. notepad++添加到运行

    1. 点击开始,输入regedit,点击回车2.在注册表中找到 HKEY_CLASSES_ROOT 下面的 Applications3.修改注册表 1).在Applications下面找到对应的程序名 ...

  3. 机器学习框架ML.NET学习笔记【9】自动学习

    一.概述 本篇我们首先通过回归算法实现一个葡萄酒品质预测的程序,然后通过AutoML的方法再重新实现,通过对比两种实现方式来学习AutoML的应用. 首先数据集来自于竞赛网站kaggle.com的UC ...

  4. RESTful API设计相关

    一  RESTful架构 在当今时代,越来越多人意识到了网站即软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high laten ...

  5. 路径方案数(mod)

    路径方案数(mod) [题目描述] 给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点, cyb 可以从 a 走到 b,当且仅当a到2的最短路,比b 到2的最短路长. 求 cy ...

  6. P3930 SAC E#1 - 一道大水题 Knight

    TLE,额 ,有空再写吧. #include<queue> #include<cstdio> #include<vector> #include<algori ...

  7. Mysql系列常见面试题(三)

    1.Mysql数据表在什么情况下容易损坏? 服务器突然断电导致数据文件损坏,强制关机,没有先关闭Mysql服务等. 2.Mysql有关全校的表都有那几个? Mysql服务器通过权限表老控制用户对数据库 ...

  8. echarts使用中的那些事儿(二)

    然而第二天的事情你怎么能猜到客户的心思呢: 客户:右边的是啥? 偶:可放大缩小查看各个时期的数据. 客户:把它去掉吧,全部直观显示. 偶:哦,不过数据过多的话会导致页面过长的. 客户:只有你知道这个可 ...

  9. Godaddy虚拟主机新建mysql数据库 2019最新

    第一次用狗爹,完全摸不着路子. 网站本地已搭建,不知道数据库是在哪里上传. 百度搜索结果都是四五年前的旧内容,耽误时间. 还是问客服,Godaddy的客服确实不赖 godaddy虚拟主机如何新建数据库 ...

  10. PADS 9.5封装向导 多一个管脚

    使用PADS 9.5封装向导(Decal Wizard)建立封装(Decals) 时遇到封装的中间多了一个管脚,如图红圈位置,通过一番搜寻,才知道这是热焊盘,不需要就在右边的红圈处去掉勾选热焊盘即可.