這題的問題我覺得在題目實在太長了, 簡單來說
有一個矩陣, 他的上下左右斜邊都是他的鄰居, 相當於他鄰居有八個(如果不是編編的話)
這其中有四個條件
如果是1(活著),
1. 周圍只有小於兩個細胞是活的, 就會死
2. 周圍有兩個或三個是活的, 繼續存活
3. 周圍三個活的, 就會死
0(死的)
4.周圍有三個活得, 就會復活
由於他有個問題, 他得一瞬間就作轉換, 我們不能像矩陣遍歷那樣一個一個換, 否則前面的換會影響到後面結果
所以我們給他四種狀態
0. 死到死 (原本的死)
1. 活到活 (原本的活)
2. 活到死
3. 死到活
用這些代號, 就算原本活到死(2)我們也可以先記錄著, 先讓別人判定完, 最終我們在把他統一module 2, 就能統一切回01
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int m = board.size();
int n = board[0].size();
vector<vector<int>> dirs{
{-1, -1}, {-1, 0},{-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1,1}};
for(int i = 0; i< m;i++){
for(int j = 0; j < n; j++){
int count = 0;
for(auto dir:dirs){
int x = i + dir[0];
int y = j + dir[1];
if( x < 0 || x >=m || y <0 || y >=n){
continue;
}
if( board[x][y] == 1|| board[x][y] == 2){
count++;
}
}
if(board[i][j] && (count < 2 || count > 3)) board[i][j] = 2;
else if (!board[i][j] && count == 3) board[i][j] = 3;
}
}
for(int i = 0; i < m; i++){
for(int j = 0;j< n;j++){
board[i][j] %= 2;
}
}
}
};