給定乙個包含 m × n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態:1 即為活細胞(live),或 0 即為死細胞(dead)。每個細胞與其八個相鄰位置(水平,垂直,對角線)的細胞都遵循以下四條生存定律:
如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡;
如果活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活;
如果活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡;
如果死細胞周圍正好有三個活細胞,則該位置死細胞復活;
根據當前狀態,寫乙個函式來計算面板上所有細胞的下乙個(一次更新後的)狀態。下乙個狀態是通過將上述規則同時應用於當前狀態下的每個細胞所形成的,其中細胞的出生和死亡是同時發生的。
示例:輸入:
[[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]輸出:
[[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]高階:
你可以使用原地演算法解決本題嗎?請注意,面板上所有格仔需要同時被更新:你不能先更新某些格仔,然後使用它們的更新後的值再更新其他格仔。
本題中,我們使用二維陣列來表示面板。原則上,面板是無限的,但當活細胞侵占了面板邊界時會造成問題。你將如何解決這些問題?
classsolution:
def gameoflife(self, board: list[list[int]]) ->none:
"""do not return anything, modify board in-place instead.
"""def
next(x,y,board):
#map=[(1, 1), (1, -1), (1, 0), (-1, 1), (-1, 0), (-1, -1), (0, 1), (0, -1)]
live=0
m=len(board)
n=len(board[0])
for i in range(x-1,x+2):
for j in range(y-1,y+2):
if i<0 or i>m-1 or j<0 or j>n-1 or (i==x and j==y):
continue
else
:
if board[i][j]==1:
live+=1
if live<2 or live>3:
return 2 #
dead
elif board[x][y]==1 or board[x][y]==0 and live==3:
return 1 #
live
else
:
return 0 #
nuhif
not board or
notboard[0]:
pass
else
: board_copy=copy.deepcopy(board)
for x in
range(len(board)):
for y in
range(len(board[0])):
ret=next(x,y,board)
if ret==1:
board_copy[x][y]=1
elif ret==2:
board_copy[x][y]=0
for x in
range(len(board)):
for y in
range(len(board[0])):
board[x][y]=board_copy[x][y]
289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態 1 即為活細胞 live 或 0 即為死細胞 dead 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...
289 生命遊戲
四月份每日一題打卡 4月2日 題目描述 解題思路 在這裡插入 片 public void gameoflife int board int dy int rows board.length int cols board 0 length for int i 0 i rows i 如果周圍細胞數少於兩...
289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態 1 即為活細胞 live 或 0 即為死細胞 dead 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...