题目:
题目链接: https://leetcode-cn.com/problems/game-of-life/
解题思路:
方法一: 使用额外的空间,来保存原始数组,此额外的数组不进行任何变动,用来对九宫格的数据进行判断
方法二:添加额外的状态来判断修改前的状态,需要额外循环一次更新状态
- 0 : 死
- 1 : 生
- 2 : 死 => 生
- 3 : 生 => 死
代码实现:
class Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
"""
0 : dead
1 : live
2 : dead -> live
3 : live -> dead
"""
live_state = [1, 3]
dead_state = [0, 2]
def get_state(i, j, board):
ret = 0
if i >= 0 and i < len(board) and j >= 0 and j < len(board[0]):
if board[i][j] in live_state:
ret = 1
else:
ret = 0
return ret
def get_live_num(i, j, board):
live_num = 0
# upper left
live_num += get_state(i - 1, j - 1, board)
# upper
live_num += get_state(i - 1, j, board)
# upper right
live_num += get_state(i - 1, j + 1, board)
# left
live_num += get_state(i, j - 1, board)
# right
live_num += get_state(i, j + 1, board)
# lower left
live_num += get_state(i + 1, j - 1, board)
# lower
live_num += get_state(i + 1, j, board)
# lower right
live_num += get_state(i + 1, j + 1, board)
return live_num
for i in range(0, len(board)):
for j in range(0, len(board[0])):
live_num = get_live_num(i, j, board)
if 0 == board[i][j] and 3 == live_num:
board[i][j] = 2
elif 1 == board[i][j] and (live_num < 2 or live_num > 3):
board[i][j] = 3
for i in range(0, len(board)):
for j in range(0, len(board[0])):
if board[i][j] == 2:
board[i][j] = 1
elif board[i][j] == 3:
board[i][j] = 0