LeetCode 289 - 生命游戏

题目描述

289. 生命游戏

解法:

讲一下这里的位操作哈:

一个int占32位,但是0、1只占一位,所有我们可以借助其余的位数来做标记。具体只用借第二位就可以,

rule 1:原来是01,周围细胞存活数小于2,右移一位就是0
rule 2:原来是01,周围细胞存活数等于2或3,01或上10就是11,右移一位就是1
rule 3:原来是01,周围细胞存活数大于3,右移一位就是0
rule 4:原来是00,周围细胞存活数等于3,00或上10就是10,右移一位就是1

真的是个神操作!!

class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        int dx[] = {-1,  0,  1, -1, 1, -1, 0, 1};
        int dy[] = {-1, -1, -1,  0, 0,  1, 1, 1};

        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
            {
                int sum = 0;
                for(int k=0;k<8;k++)
                {
                    int nx = i + dx[k];
                    int ny = j + dy[k];
                    if((nx>=0 && nx<board.size()) && (ny>=0 && ny<board[0].size()))
                        sum += (board[nx][ny]&1); // 只累加最低位
                }
                if(board[i][j]==1)
                {
                    if(sum==2 || sum==3) board[i][j] |= 2; // 使用第二个bit标记是否存活
                }
                else
                {
                    if(sum==3) board[i][j] |= 2;
                }   
            }
        }
        for(int i=0;i<board.size();i++)
        {
            for(int j=0;j<board[0].size();j++)
                board[i][j] >>= 1;
        }
    }
};
发布了152 篇原创文章 · 获赞 22 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/105279887