leetcode-Game of Life-289

生态系统游戏,输入一个01矩阵,0代表死了,1代表活着,这是当前状态,求下一个状态:

1.当前格子活的:

  1)周围活着的格子<2或者>3,则当前格子死

  2)否则当前格子保持

2.当前格子死:

  1)周围活着的格子==3,则当前格子活

  2)否则当前格子保持

周围格子是指周围8个

 

如果不要求空间可以重新申请一个矩阵,遍历当前矩阵然后把结果放在新申请的矩阵

要求空间O1,则这里用到一个技巧,其实不算位运算,不过也算利用了二进制位:

一个格子无非四种状态,用0,1,2,3保存,即保存了转换后的状态又保存了转换前状态:

0:dead->dead

3:dead->live

1:live->live

2:live->dead

最后再遍历一遍矩阵,所有格子&1即可

 1 class Solution {
 2 public:
 3     int get(vector<vector<int> > v,int i,int j){
 4         int d[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,1},{-1,1},{1,-1}};
 5         int cnt=0;
 6         for(int k=0;k<8;k++){
 7             int x=i+d[k][0];
 8             int y=j+d[k][1];
 9             if(x>=0&&x<v.size()&&y>=0&&y<v[i].size()&&(v[x][y]==1||v[x][y]==2)) cnt++;
10         }
11         return cnt;
12     }
13     void gameOfLife(vector<vector<int> >& board) {
14         int len=board.size();
15         if(len==0) return;
16         int n=board[0].size();
17         for(int i=0;i<len;i++){
18             for(int j=0;j<n;j++){
19                 int cnt=get(board,i,j);
20                 if(board[i][j]&1){
21                     if(cnt<2||cnt>3) board[i][j]=2;
22                     else board[i][j]=1;
23                 }
24                 else{
25                     if(cnt==3) board[i][j]=3;
26                     else board[i][j]=0;
27                 }
28             }
29         }
30         for(int i=0;i<len;i++){
31             for(int j=0;j<n;j++){
32                 board[i][j]&=1;
33             }
34         }
35     }
36 };

 

posted @ 2016-09-01 22:19  0_summer  阅读(181)  评论(0编辑  收藏  举报