給定乙個包含 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]
]高階:
你可以使用原地演算法解決本題嗎?請注意,面板上所有格仔需要同時被更新:你不能先更新某些格仔,然後使用它們的更新後的值再更新其他格仔。
本題中,我們使用二維陣列來表示面板。原則上,面板是無限的,但當活細胞侵占了面板邊界時會造成問題。你將如何解決這些問題?
原地演算法是什麼???? 模擬模擬模擬,不會就模擬。。。。。。。
複製乙份原始陣列,用來記錄改變後的細胞狀態。模擬過程就行。。
class
solution,,
,,,,
,};for
(int k =
0; k <
8; k++)if
(count <
2||count >3)
t =0;
if(count ==3)
t =1;
eboard[i]
[j]= t;}}
for(
int i =
0; i < board.
size()
; i++)}
}};
方法一中 o(mn) 的空間複雜度在陣列很大的時候記憶體消耗是非常大的。題目中每個細胞只有兩種狀態 1,0,但我們可以拓展一些復合狀態使其包含之前的狀態。舉個例子,如果細胞之前的狀態是 0,但是在更新之後變成了 1,我們就可以給它定義狀態 2。這樣我們看到 2,既能知道目前這個細胞是活的,還能知道它之前是死的。如果之前狀態是1 現在更新後變成 0 我們可以定義為 -1 .這樣就不怕在更新的時候遍歷下乙個細胞的時候產生影響(因為題目寫著「細胞的出生和死亡是同時發生的。」)不然上面就不用複製陣列了
class
solution,,
,,,,
,};for
(int k =
0; k <
8; k++)if
((count <
2||count >3)
&& t ==1)
t =-1
;if(count ==
3&& t ==0)
t =2;
board[i]
[j]= t;}}
for(
int i =
0; i < board.
size()
; i++)}
}};
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 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...
289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態 1 即為活細胞 live 或 0 即為死細胞 dead 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...