[Leetcode] 第289题 生命游戏

Posted 龙场驿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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 };

 





以上是关于[Leetcode] 第289题 生命游戏的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 289 - 生命游戏 - 原地算法

LeetCode第289场单周赛 --- 用中等题来骗来偷袭我这个老同志?

LeetCode刷题模版:273 - 275278 - 279283 - 284287289 - 290

LeetCode刷题模版:273 - 275278 - 279283 - 284287289 - 290

LeetCode 0289. 生命游戏

[LeetCode] 289. Game of Life