@snuffles
2019-04-02T08:40:07.000000Z
字数 1505
阅读 1063
数组
根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。
解:这道题的关键是如何同时更新所有的格子,其他格子不受影响。解法是利用状态机。
class Solution {
public:
void gameOfLife(vector<vector<int>>& board) {
int row = board.size();
int col = board[0].size();
int tmp;
/* state
0: dead->dead
1:live->live
2:dead->live
3:live->dead
*/
for(int i =0; i< row;i++){
for(int j=0;j<col;j++){
// if dead
tmp = sumclose(board,i,j,row,col);
if(board[i][j] %2 == 0){
if(tmp==3) board[i][j]=2;
else board[i][j]=0;
}
if(board[i][j] %2== 1){
if(tmp==2 || tmp==3) board[i][j]=1;
else board[i][j]=3;
}
}
}
for(int i =0; i<row;i++){
for(int j=0;j<col;j++){
if(board[i][j]==0 ||board[i][j]==3) board[i][j]=0;
if(board[i][j]==1 ||board[i][j]==2) board[i][j]=1;
}
}
}
int sumclose(vector<vector<int>>& board,int i, int j,int row,int col){
/*
a b c
d ? e
f g h
*/
int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;
if(i-1>=0 && i-1<row && j-1>=0 && j-1<col) a = board[i-1][j-1]%2;
if(i-1>=0 && i-1<row && j>=0 && j<col) b = board[i-1][j]%2;
if(i-1>=0 && i-1<row && j+1>=0 && j+1<col) c = board[i-1][j+1]%2;
if(i>=0 && i<row && j-1>=0 && j-1<col) d = board[i][j-1]%2;
if(i>=0 && i<row && j+1>=0 && j+1<col) e = board[i][j+1]%2;
if(i+1>=0 && i+1<row && j-1>=0 && j-1<col) f = board[i+1][j-1]%2;
if(i+1>=0 && i+1<row && j>=0 && j<col) g = board[i+1][j]%2;
if(i+1>=0 && i+1<row && j+1>=0 && j+1<col) h = board[i+1][j+1]%2;
return a+b+c+d+e+f+g+h;
}
};