文章目录
- 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;}}}
};