[ Leetcode ] No.289 生命游戏

题目:
给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。
每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:
如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
根据当前状态,写一个函数来计算面板上所有细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

思路:

  1. 构建两个数组,每个位置分别代表了8个不同的方向。顺序是:上、右上、右、右下、下、左下、左、左上。
  2. 再构建一个数组w[m][n],对第i行j列的元素而言,周围共有几个1。w初始化为0。
  3. 对于每个board[i][j]来说,如果它的8个方向均在数组范围内,且值为1,则w的值加1。
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        int m = board.size(), n = board[0].size(); // m行n列
        int x[8] = {-1, -1, 0, 1, 1, 1, 0, -1}; // 共8个方向
        int y[8] = {0, 1, 1, 1, 0, -1, -1, -1};
        vector<vector<int>> w(m, vector<int>(n, 0)); //初始化w

        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                for(int k = 0; k < 8; k++) {
                    int a = i + x[k], b = j + y[k];
                    if(a >= 0 && a < m && b >=0 && b < n) { //判断是否越界
                        if(board[a][b] == 1) w[i][j] += 1; // w保存周围1的个数
                    }    
                }
            }
        }
        // 以下为判断条件
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(w[i][j] < 2 || w[i][j] > 3) w[i][j] = 0;
                else {
                    if((w[i][j] == 3) || (board[i][j] == 1 && w[i][j] == 2)) w[i][j] = 1;
                    else w[i][j] = 0;
                }
            }
        }
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) board[i][j] = w[i][j];
        }
    }
};

这题不难,但是对于我差不多将近3个月没写代码的人来讲,能一次AC并且打败了100%,还是比较兴奋的.... 感谢闫总的教学...

猜你喜欢

转载自www.cnblogs.com/recoverableTi/p/12623381.html