給定乙個包含 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]
]思路:由於面板上所有的格仔需要同時被更新,所以不能先更新某些格仔,然後使用它們的更新後的值再更新其他格仔。
我們可以用另乙個陣列把原始陣列儲存起來,然後遍歷一遍該陣列,根據該陣列網格內的值判斷細胞是否存活,繼而修改原陣列。對應**1
也可以不用額外陣列空間,我們知道,乙個int值包含4個位元組,有32個位元位,但是原陣列中每個網格的值非0即1,還有31個位元位未使用。可以用倒數第二個位元位作為修改後陣列的值,當修改完陣列後,再將陣列中所有的元素右移一位即可。*對應**2
*
*solution1*
*void
gameoflife
(vectorint>>
& board)
else}}
}
*
*solution2:**
void
gameoflife
(vectorint>>
& board),,
,,,,
,};int m=board.
size()
,n=board[0]
.size()
;int cnt;
for(
int i=
0;i((board[i]
[j]&1)
==1)else}}
for(
int i=
0;i)for
(int j=
0;j) board[i]
[j]>>=1;
}
leetcode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞周...
Leetcode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞周...
LeetCode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...