leetcode刷题系列2019-5-10---生命游戏

289 生命游戏

根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

  • 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
  • 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
  • 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
  • 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
  • 根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

示例:

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

解题思路:

这个题根据题意一步一步做就可以解出来,但是不能一边遍历一边修改,只能先遍历一遍,记录好哪些细胞需要改变状态。然后在第二遍遍历的时候更新状态。只能增加几个细胞的状态,如2代表现在是live并且下一个状态也是live;3代表现在是live但是下一个状态是dead;4代表现在是dead但是下一个状态是live,代码如下:

class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        #// 当前是活的,下一刻活的:2
        #// 当前是活的,下一刻死的:3
        #// 当前是死的,下一刻活的:4
        m = len(board) # 行
        n = len(board[0]) # 列
        for i in range(m):
            for j in range(n):
                # 判断周围细胞情况
                livecount = 0
                for x in range(max(0,i-1),min(m,i+2)):
                    for y in range(max(0,j-1),min(n,j+2)):
                        if (board[x][y] == 1 or board[x][y] == 2 or board[x][y] == 3)and not (x == i and y == j):
                            livecount += 1

                # 根据周围的细胞数量改变状态
                if (board[i][j] == 1 or board[i][j] == 2 or board[i][j] == 3) : # 细胞活的
                    if livecount < 2 or livecount > 3:
                        board[i][j] = 3
                else:
                    if livecount == 3:
                        board[i][j] = 4
                    else:
                        board[i][j] = 0
        for i in range(m):
            for j in range(n):
                if board[i][j] == 3:
                    board[i][j] = 0
                if board[i][j] == 4:
                    board[i][j] = 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值