Game of Life
来源:互联网 发布:淘宝符咒 编辑:程序博客网 时间:2024/06/05 15:20
因为要求in-place,所以要用状态机状态转换的方法:
状态0: 死细胞转为死细胞
状态1: 活细胞转为活细胞
状态2: 活细胞转为死细胞
状态3: 死细胞转为活细胞
最后我们对所有状态对2取余,那么状态0和2就变成死细胞,状态1和3就是活细胞,达成目的。我们先对原数组进行逐个扫描,对于每一个位置,扫描其周围八个位置,如果遇到状态1或2,就计数器累加1,扫完8个邻居,如果少于两个活细胞或者大于三个活细胞,而且当前位置是活细胞的话,标记状态2,如果正好有三个活细胞且当前是死细胞的话,标记状态3。完成一遍扫描后再对数据扫描一遍,对2取余变成我们想要的结果。class Solution {public: void gameOfLife(vector<vector<int> >& board) { int m = board.size(), n = m ? board[0].size() : 0; int dx[] = {-1, -1, -1, 0, 1, 1, 1, 0}; int dy[] = {-1, 0, 1, 1, 1, 0, -1, -1}; for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { int cnt = 0; for (int k = 0; k < 8; ++k) { int x = i + dx[k], y = j + dy[k]; if (x >= 0 && x < m && y >= 0 && y < n && (board[x][y] == 1 || board[x][y] == 2)) { ++cnt; } } if (board[i][j] && (cnt < 2 || cnt > 3)) board[i][j] = 2; else if (!board[i][j] && cnt == 3) board[i][j] = 3; } } for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { board[i][j] %= 2; } } }};
上面的代码是网上找到的,我自己照着这个思路写了一份,用了8个if来判断,不仅非常麻烦,而且容易出错,不如直接用数组dx,只需要限制经过计算的x,y的范围就好了(x >= 0 && x < m && y >= 0 && y < n )。还有一个需要注意的地方,x是列,y是行。
0 0
- Game of Life
- Game Of Life
- LeetCode:Game of Life
- LeetCode: Game of Life
- Game of Life
- leetcode289 : Game of Life
- 【LeetCode】Game of Life
- Game of Life
- Game of Life
- LeetCode Game of Life
- Leetcode Game of Life
- Game of Life
- Game of Life
- [289]Game of Life
- [LeetCode] Game of Life
- Game Of Life
- LeetCode -- Game of Life
- 【leetcode】Game of Life
- Java中的volatile关键字
- 单节点伪分布式Hadoop安装
- (1) 找出两个字符串的最大子串
- poj3259Wormholes(bellman判断负环的问题最短路)
- Path for project must have only one segment
- Game of Life
- universalMusicPlayer samples 代码学习
- Python——12类的继承
- 51Nod-1024-矩阵中不重复的元素
- LeetCode 98 Validate Binary Search Tree
- Picasso源码分析
- hibernate实体关系映射
- 七牛 第三方资源抓取(Python3)
- Insight spring @Scheduled 解析过程