LeetCode(289)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):
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?
分析
基于一个生命游戏的题目,游戏介绍。
生死判断条件:
- 一個活的格子若只有一個或沒有鄰居, 在下一秒將因寂寞而亡;
- 一個活的格子若有四個或四個以上的鄰居, 在下一秒將因拥擠而亡;
- 一個活的格子若有二個或三個鄰居, 在下一秒將継續活著;
- 一個死的格子若有三個鄰居, 在下一秒將活過來;
题目要求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;
}
};
LeetCode(289)Game of Life的更多相关文章
- LeetCode(275)H-Index II
题目 Follow up for H-Index: What if the citations array is sorted in ascending order? Could you optimi ...
- LeetCode(220) Contains Duplicate III
题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...
- LeetCode(154) Find Minimum in Rotated Sorted Array II
题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...
- 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 ...
- LeetCode(116) Populating Next Right Pointers in Each Node
题目 Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode * ...
- 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 ...
- 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 ...
- 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 ...
- Leetcode(1)两数之和
Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一 ...
随机推荐
- Net Core构建Angular4应用程序
在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序 前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1 ...
- ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面” DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求 ...
- 转 DataGuard环境搭建 (一主一备一级联)
DataGuard环境搭建 (一主一备一级联) http://blog.itpub.net/30130773/viewspace-2116985/ 1.--------- primary_role / ...
- 老男孩IT教育-每日一题汇总
老男孩IT教育-每日一题汇总 第几天 第几周 日期 快速访问链接 第123天 第二十五周 2017年8月25日 出现Swap file….already exists以下错误如何解决? 第122天 2 ...
- CallContext的LogicalCallContext在多线程环境下面公用变量
压根名听说过这个类的看这里:如何实现对上下文(Context)数据的统一管理 原来以为CallContext就可以直接在多线程环境下面共享使用的,今天突然想到:Asp.Net环境下面,设置来设置去的, ...
- SQL判断一个事件段 是否在数据库中与其他时间段有重叠 判断时间重叠
数据库字段startDate 开始时间 endDate 结束时间 -两个参数 比如查2-2 至2-6 在数据库中是否与其他时间有重叠 四个条件有一项满足则有重叠时间 思路是这样子 以开始和结束 ...
- leetcode84 Largest Rectangle in Histogram
思路: 使用单调栈计算每个位置左边第一个比它矮的位置和右边第一个比它矮的位置即可. 实现: #include <bits/stdc++.h> using namespace std; cl ...
- 20170405JDBC数据查询
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- ptxas fatal : Unresolved extern function Error 255
This question already has an answer here: External calls are not supported - CUDA 1 answer I am tryi ...
- 用指针的方式实现,重写strrchr函数的功能
char *strchrTest(char * ptr,char c); Action(){ char str[]={"thisisadog"}; char c='s'; lr_o ...