分析
总体思路是位运算。
分析棋盘:
- 每个棋子只有1和0两个状态。
- 每个棋子轮转到下一个状态取决于其周围8个格子中的存活棋子数。
为了让格子能原地存储下一个轮转状态,我们利用元素是32位整型的特性,开辟第二个bit来存储下一存活状态。
最后更新状态时,右移1位将当前状态消去即可。
答案
class Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
dirs = [[0,1],[0,-1],[-1,1],[-1,0],[-1,-1],[1,1],[1,0],[1,-1]]
for i in range(len(board)):
for j in range(len(board[i])):
center = board[i][j]
alive_num = 0
for dx, dy in dirs:
ni, nj = i + dx, j + dy
if ni >= 0 and ni < len(board) and nj >= 0 and nj < len(board[0]):
if board[ni][nj] & 1 == 1:
alive_num += 1
if center == 1:
if alive_num == 2 or alive_num == 3:
board[i][j] |= 2
else:
if alive_num == 3:
board[i][j] |= 2
for i in range(len(board)):
for j in range(len(board[i])):
board[i][j] >>= 1