289. 生命游戏

不需要开出额外的数组,巧妙地存储答案,值得记录一下。但是注意这个方法只能应用在原数组为0,1的情况下

class Solution {
public:
    int f[2][8] = {{1, -1, 0, 0, 1, -1, 1, -1},
                   {1, -1, 1, -1, -1, 1, 0, 0}};

    void gameOfLife(vector<vector<int>>& board) {
        int len1, len2;
        len1 = board.size();
        
        if(!len1) {
            return ;
        }

        int i, j, ret;

        len2 = board[0].size();
        for(i = 0; i < len1; i++) {
            for(j = 0; j < len2; j++) {
                ret = cal(board, i, j);
                if(board[i][j] == 0) {
                    if(ret == 3) {
                        board[i][j] += 2;
                    }
                }
                else {
                    if(ret == 2 || ret == 3) {
                        board[i][j] += 2;
                    }
                }
            }
        }

        for(i = 0; i < len1; i++) {
            for(j = 0; j < len2; j++) {
                board[i][j] >>= 1;
            }
        }
    }

    int cal(vector<vector<int>>& board, int x, int y) {
        int ans = 0;
        for(int i = 0; i < 8; i++) {
            int tx = x + f[0][i];
            int ty = y + f[1][i];
            if(tx >= 0 && ty >= 0 && tx < board.size() && ty < board[0].size()) {
                ans += (board[tx][ty] & 1);
            }
        }
        return ans;
    }
};
/*
题目本身并不难,这个题最巧妙的地方在于空间的节省,不需要开放额外的数组,通过位移运算符,
第0位为原来的值,而我们的答案存储在第一位,这样在最后输出的时候,输出第一位的值就可以了
*/

 

posted @ 2020-04-02 09:24  Let_Life_Stop  阅读(149)  评论(0编辑  收藏  举报