[Leetcode] 第289题 生命游戏
一、题目描述
根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
- 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
- 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
- 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
- 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。
示例:
输入: [[0,1,0],[0,0,1],[1,1,1],[0,0,0] ] 输出: [[0,0,0],[1,0,1],[0,1,1],[0,1,0] ]
二、题目解析
//根据矩阵的前一状态更新下一个状态,原地变换
//将原来是1,现在是0的位置用2标记;原来是0,现在是1的位置用3标记
//那么检查几个方向,如果是1或者2,代表这个位置原来是1;如果是0或者3,代表这个位置原来是0
//最后将所有的2换为0,将所有的3换为1即可
//判断前后左右上下的方法,采用循环。——注意判断面板边界
三、代码实现
1 class Solution { 2 public: 3 void gameOfLife(vector<vector<int>>& board) { 4 int m = board.size(); 5 if (!m)return; 6 int n = board[0].size(); 7 if (!n)return; 8 int live_cnt; 9 for (int i = 0; i < m; ++i) { 10 live_cnt = 0; 11 for (int j = 0; j < n; ++j) { 12 live_cnt = getLive(i, j, board); 13 if (board[i][j] == 0 && live_cnt == 3)board[i][j] = 3; 14 else if (board[i][j] == 1) { 15 --live_cnt;//包含自身 16 if (live_cnt < 2 || live_cnt>3) 17 board[i][j] = 2; 18 } 19 } 20 } 21 for (int i = 0; i < m; ++i) { 22 for (int j = 0; j < n; ++j) { 23 if (board[i][j] == 2) 24 board[i][j] = 0; 25 else if (board[i][j] == 3) 26 board[i][j] = 1; 27 } 28 } 29 } 30 private: 31 int getLive(int row, int col, vector<vector<int>> &board) { 32 int live_cnt = 0; 33 int m = board.size(), n = board[row].size(); 34 for (int i = max(0, row - 1); i < min(m, row + 2); ++i) { 35 for (int j = max(0, col - 1); j < min(n, col + 2); ++j) { 36 if (board[i][j] == 1 || board[i][j] == 2) 37 ++live_cnt; 38 } 39 } 40 return live_cnt; 41 } 42 };
转载于:https://www.cnblogs.com/zhizhiyu/p/10173172.html
[Leetcode] 第289题 生命游戏相关推荐
- [Leedcode][JAVA][第289题][生命游戏]
[问题描述] 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机.给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞都具 ...
- Leetcode 289:生命游戏(最详细的解法!!!)
根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初始状态 liv ...
- 蓝桥杯------2017 Java B组 国赛:第二题 生命游戏
题目描述: 康威生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 这个游戏在一个无限大的2D网格上进行. 初始时,每个小方格中居住着一个活着或死了的细胞. 下一时刻每个细胞的状态 ...
- 跳格子问题(LeetCode第55题 跳跃游戏)平民解
目录 三种思路 1.动态规划(结果超时) 2.贪心法 3.换一种思路 三种思路 1.动态规划(结果超时) 时间复杂度为o(n^2) def canJump(self, nums):"&quo ...
- LeetCode第174题--地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
- 伍六七带你学算法 进阶篇-生命游戏
有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...
- LeetCode 289. 生命游戏(位运算)
文章目录 1. 题目 2. 解题 2.1 复制数组解法 2.2 原地解法 2.3 位运算 1. 题目 链接:289. 生命游戏 2. 解题 2.1 复制数组解法 很简单,按照题意模拟即可 class ...
- LeetCode 289. 生命游戏
289. 生命游戏 思路:数每个格子周围Cell存活数 笔记:vector复制 vector<vector<int> > tmp(board); class Solution ...
- 【leetcode】289.生命游戏 (三种解法开阔思路,java实现)
289. 生命游戏 难度中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个 ...
最新文章
- 将调用密集型的 COM 组件迁移到托管代码
- Linux之bash编程基本语法
- [HAOI2009]毛毛虫
- BZOJ4653 洛谷1712 UOJ222:[NOI2016]区间——题解
- Nginx-02:Nginx基本概念
- Android图表和图形创建库:EazeGraph
- 注解_JDK内置注解
- python使用异常的目的和好处_python 错误与异常,python assert的作用
- 想要换壁纸,看这个网站就够了!
- centos7linux菜鸟入门,CentOS 7入门操作基础教程
- win7怎么清除卸载Ghost启动项的残留
- _Linux学习手册(二)—文件目录类命令
- (一)PyQt5基础学习
- 关于安全校验代码的一些心得
- 需求分析的文档模板的书写方式
- Steam游戏存档位置大全
- youtube-dl 安装和用法
- 柠檬文案:水果柠檬宣传文案
- ldap根据dn值查找objectClass
- 一句话生成图片,FlagAI使用(附页面操作代码) | 机器学习
热门文章
- SAP CRM和Cloud for Customer的Account merge
- 动态加载___import__动态加载技术
- linux web 服务器性能,Linux系统Web服务器性能测试(2)
- solr java 全量,Solr实时创建增量或全量索引
- pdfbox 按章节读取_2020年智慧树APP微生物与健康第五单元章节测试网课答案大学课后答案...
- linux otl oracle,linux otl 连接数据库
- c语言调用tensorflow模型,C++调用Python中的Tensorflow模型
- 库存转换是什么意思_为什么要用WMS系统?WMS能带来哪些价值
- 五金手册在线查询_带剔除在线分选秤 零食袋装称重剔除秤-技术文章
- 腾讯机器狗,站起来了!