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