[Leetcode] 第289题 生命游戏

一、题目描述

根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

示例:

输入: 
[
  [0,1,0],
  [0,0,1],
  [1,1,1],
  [0,0,0]
]
输出: 
[
  [0,0,0],
  [1,0,1],
  [0,1,1],
  [0,1,0]
]

二、题目解析

//根据矩阵的前一状态更新下一个状态,原地变换
//将原来是1,现在是0的位置用2标记;原来是0,现在是1的位置用3标记
//那么检查几个方向,如果是1或者2,代表这个位置原来是1;如果是0或者3,代表这个位置原来是0
//最后将所有的2换为0,将所有的3换为1即可
//判断前后左右上下的方法,采用循环。——注意判断面板边界

三、代码实现

 1 class Solution {
 2 public:
 3     void gameOfLife(vector<vector<int>>& board) {
 4         int m = board.size();
 5         if (!m)return;
 6         int n = board[0].size();
 7         if (!n)return;
 8         int live_cnt;
 9         for (int i = 0; i < m; ++i) {
10             live_cnt = 0;
11             for (int j = 0; j < n; ++j) {
12                 live_cnt = getLive(i, j, board);
13                 if (board[i][j] == 0 && live_cnt == 3)board[i][j] = 3;
14                 else if (board[i][j] == 1) {
15                     --live_cnt;//包含自身
16                     if (live_cnt < 2 || live_cnt>3)
17                         board[i][j] = 2;
18                 }
19             }
20         }
21         for (int i = 0; i < m; ++i) {
22             for (int j = 0; j < n; ++j) {
23                 if (board[i][j] == 2)
24                     board[i][j] = 0;
25                 else if (board[i][j] == 3)
26                     board[i][j] = 1;
27             }
28         }
29     }
30 private:
31     int getLive(int row, int col, vector<vector<int>> &board) {
32         int live_cnt = 0;
33         int m = board.size(), n = board[row].size();
34         for (int i = max(0, row - 1); i < min(m, row + 2); ++i) {
35             for (int j = max(0, col - 1); j < min(n, col + 2); ++j) {
36                 if (board[i][j] == 1 || board[i][j] == 2)
37                     ++live_cnt;
38             }
39         }
40         return live_cnt;
41     }
42 };
原文地址:https://www.cnblogs.com/zhizhiyu/p/10173172.html