LeetCode 289. 生命游戏(位运算)
文章目录
- 1. 题目
- 2. 解题
- 2.1 复制数组解法
- 2.2 原地解法
- 2.3 位运算
1. 题目
链接:289. 生命游戏
2. 解题
2.1 复制数组解法
很简单,按照题意模拟即可
class Solution {public:void gameOfLife(vector<vector<int>>& board) {if(board.empty())return;vector<vector<int>> cp(board);//复制数组法int nearby[8][2] = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1},{1, 0}, {1, 1}, {0, 1}, {-1, 1}};int m = board.size(), n = board[0].size(), i, j, k, x, y, live;for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){live = 0;for(k = 0; k < 8; ++k){x = i+nearby[k][0];y = j+nearby[k][1];if(x>=0 && x<m && y>=0 && y<n && cp[x][y])live++;}if(cp[i][j]){if(live < 2 || live > 3)board[i][j] = 0;}else{if(live == 3)board[i][j] = 1;}}}}
};
2.2 原地解法
- 原来是1,标记成0,用2表示(等于1或者2,原状态都是1)
- 原来是0,标记成1,用3表示(等于0或者3,原状态都是0)
- 处理完后,改写数组
- 等于2的,赋值为0
- 等于3的,赋值为1
class Solution {public:void gameOfLife(vector<vector<int>>& board) {if(board.empty())return;int nearby[8][2] = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1},{1, 0}, {1, 1}, {0, 1}, {-1, 1}};int m = board.size(), n = board[0].size(), i, j, k, x, y, live;for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){live = 0;for(k = 0; k < 8; ++k){x = i+nearby[k][0];y = j+nearby[k][1];if(x>=0 && x<m && y>=0 && y<n && (board[x][y]==1 || board[x][y]==2))live++;}if(board[i][j]){if(live < 2 || live > 3)board[i][j] = 2;}else{if(live == 3)board[i][j] = 3;}}}for(i = 0; i < m; ++i){for(j = 0; j < n; ++j){if(board[i][j] == 2)board[i][j] = 0;else if(board[i][j] == 3)board[i][j] = 1;}}}
};
2.3 位运算
- 利用数值的低位作为原数据
- 高位保存周围存活的数量
class Solution {public:void gameOfLife(vector<vector<int>>& board) {if (board.empty())return;int m = board.size(), n = board[0].size(), i, j, k, x, y, live;int nearby[8][2] = {{-1, 0}, {-1, -1}, {0, -1}, {1, -1},{1, 0}, {1, 1}, {0, 1}, {-1, 1}}; for (i = 0; i < m; ++i) {for (j = 0; j < n; ++j) {for (k = 0; k < 8; ++k) {x = i + nearby[k][0];y = j + nearby[k][1];if (x >= 0 && x < m && y >= 0 && y < n)board[i][j] += (board[x][y] & 1) << 1;}}}for (i = 0; i < m; ++i) {for (j = 0; j < n; ++j) {live = board[i][j] >> 1;if (live < 2 || live > 3) board[i][j] = 0;else if (live == 3)board[i][j] = 1;elseboard[i][j] &= 1;}}}
};
LeetCode 289. 生命游戏(位运算)相关推荐
- LeetCode 289. 生命游戏
289. 生命游戏 思路:数每个格子周围Cell存活数 笔记:vector复制 vector<vector<int> > tmp(board); class Solution ...
- [leetcode][289. 生命游戏]
根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞具有一个初始状态 liv ...
- c语言 细胞自动机,Leetcode 289. 生命游戏 (细胞自动机)
二维网格遍历注意使用技巧让代码可读性强. 原始的思路是使用一个二维数组进行更新,当全部更新完以后,复制这个二维数组到原来的数组上. 可不可以优化,不使用额外的空间,答案是可以的 细胞的状态如下: ...
- 【leetcode】289.生命游戏 (三种解法开阔思路,java实现)
289. 生命游戏 难度中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个 ...
- LeetCode 0289. 生命游戏
[LetMeFly]289.生命游戏 力扣题目链接:https://leetcode.cn/problems/game-of-life/ 根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约 ...
- 【LeetCode】妙用位运算解题
[LeetCode]妙用位运算解题 文章目录 [LeetCode]妙用位运算解题 交替位二进制数★ 插入★ 数字范围按位与★★ 比特位计数★★ 下一个数★★ 消失的两个数字★★★ 修改后的最大二进制字 ...
- leetcode 289. Game of Life | 289. 生命游戏(Java)
题目 https://leetcode.com/problems/game-of-life/ 题解 首先,遍历整个棋盘,如果是 1,就将上下左右的 count 值加 1. 然后,没有任何技巧,就是根据 ...
- LeetCode刷题:位运算(找不同 和 只出现一次的数字)
1.常见的位运算 按位与&:(1&1=1,1&0=0,0&1=0,0&0=0); 按位或 | : (1 | 1=1,1 | 0=1,0 | 1=1,0 | 0= ...
- 289. 生命游戏。
根据 百度百科 , 生命游戏 ,简称为 生命 ,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞.每个细胞都具有一 ...
最新文章
- 【AngularJS】—— 9 自定义过滤器
- MyEclipse设置JSP页面默认编码方式
- zabbix对一台主机监控的操作
- Go 语言编程 — 编码规范指南
- 1.8 循环神经网络的梯度消失-深度学习第五课《序列模型》-Stanford吴恩达教授
- php static method,php 类方法用static::hello(); 等同于 $this-hello();吗?
- php数组去空函数怎么写,分享php数组去除空值函数
- Spring中的InitializingBean接口的使用
- 启动和关闭oracle 实例,oracle实例和数据库启动与关闭.ppt
- RecyclerView刷新布局时Glide加载图片闪现
- mysql左连接查询慢
- 通过Matlab实现函数的简单的微分积分运算
- 全国社会组织信用信息公式平台(试运行)爬虫记录
- 元宇宙营销新时代| 元宇宙数字营销峰会于7月29日在上海淳大万丽酒店盛大开幕!
- 致计算机专业准大一新生
- SEO人员,为什么要做流量过滤,如何操作?
- Android Studio中Cannot resolve symbol XXX的解决方法
- Linux(CentOS)安装MySQL教程
- Msgbox信息提示框
- 用友增资致远1200万 国内最大OA厂商发布新品