当前位置: 首页 > news >正文

leetcode-289:生命游戏

leetcode-289:生命游戏

  • 题目
  • 解题
    • 方法一:
    • 方法二:原地替换-位运算

题目

题目连接

根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态: 1 即为 活细胞 (live),或 0 即为 死细胞 (dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

1.如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
2.如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
3.如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
4.如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态,返回下一个状态。

示例 1:
在这里插入图片描述

输入:board = [[0,1,0],[0,0,1],[1,1,1],[0,0,0]]
输出:[[0,0,0],[1,0,1],[0,1,1],[0,1,0]]
示例 2:

在这里插入图片描述

输入:board = [[1,1],[1,0]]
输出:[[1,1],[1,1]]

解题

方法一:

class Solution {
public:
    vector<vector<int>> dirs={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1}};
    void gameOfLife(vector<vector<int>>& board) {
        int m=board.size(),n=board[0].size();
        vector<vector<int>> res(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int count=0;
                for(vector<int>& dir:dirs){
                    int x=i+dir[0];
                    int y=j+dir[1];
                    if(x<0||x>=m||y<0||y>=n) continue;
                    count+=board[x][y];
                }
                if(board[i][j]==1){
                    if(count<2||count>3) res[i][j]=0;
                    else res[i][j]=1;
                }else{
                    if(count==3) res[i][j]=1;
                    else res[i][j]=0;
                }
            }
        }
        board=res;
    }
};

方法二:原地替换-位运算

int类型有32位,而原board中,只有 0、1,只占用一个位。因此可以将第2个位,用于存储结果。最后将第2个位刷新成最低位

class Solution {
public:
    vector<vector<int>> dirs={{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1},{0,1},{-1,1}};
    void gameOfLife(vector<vector<int>>& board) {
        int m=board.size(),n=board[0].size();
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int count=0;
                for(vector<int>& dir:dirs){
                    int x=i+dir[0];
                    int y=j+dir[1];
                    if(x<0||x>=m||y<0||y>=n) continue;
                    count+=board[x][y]&1;//只累加最低位
                }
                if(board[i][j]==1){
                    if(count<2||count>3) board[i][j]|=0;
                    else board[i][j]|=2;
                }else{
                    if(count==3) board[i][j]|=2;
                    else board[i][j]|=0;
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                board[i][j]>>=1;
            }
        }
    }
};

相关文章:

  • C语言中的结构体应用详解及注意事项
  • 【2022】Elasticsearch-7.17.6集群部署
  • 计算器——位运算(c语言)
  • Maven 基础 5 第一个Maven 项目(IDEA 生成)
  • TypeScript算法题实战——哈希表篇
  • 嵌入式分享合集71
  • 又一巅峰神作 14年工作经验大佬手写“微服务项目下高并发的流量治理”,太牛了
  • 谷歌翻译失败解决方案
  • 网络安全面试题目及详解
  • 【初阶与进阶C++详解】第二十三篇:异常(异常抛出+异常捕获+异常优缺点)
  • 第二弹:看了图像分割一系列Unet、DeepLabv3+改进期刊论文,总结改进创新的一些相同点
  • HTML期末大作业 使用HTML+CSS制作科技文化主题网站(航天之路)
  • ElasticSearch_04_批量处理命令mget和bulk的使用
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • web期末作业设计网页 html+css+js制作非物质文化遗产坝漆国漆 2页
  • android 一些 utils
  • Android开源项目规范总结
  • Asm.js的简单介绍
  • Linux中的硬链接与软链接
  • mockjs让前端开发独立于后端
  • scala基础语法(二)
  • tensorflow学习笔记3——MNIST应用篇
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vim Clutch | 面向脚踏板编程……
  • webpack入门学习手记(二)
  • 阿里云Kubernetes容器服务上体验Knative
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 工程优化暨babel升级小记
  • 今年的LC3大会没了?
  • 配置 PM2 实现代码自动发布
  • 什么是Javascript函数节流?
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • zabbix3.2监控linux磁盘IO
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #pragma data_seg 共享数据区(转)
  • (3)选择元素——(17)练习(Exercises)
  • (floyd+补集) poj 3275
  • (力扣)1314.矩阵区域和
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (排序详解之 堆排序)
  • (五)关系数据库标准语言SQL
  • (新)网络工程师考点串讲与真题详解
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 回调、接口回调、 委托
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • @EnableWebMvc介绍和使用详细demo
  • [2018-01-08] Python强化周的第一天
  • [ABC294Ex] K-Coloring
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [Android]Android开发入门之HelloWorld
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)
  • [C#][DevPress]事件委托的使用
  • [DL]深度学习_Feature Pyramid Network