leetcode:289. 生命遊戲
示例:輸入:
[[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
if(i-
1>=
0&&j>=
0&&board[i-1]
[j]==1)
if(i-
1>=
0&&j+
1[j+1]==
1)if(j-
1>=
0&&board[i]
[j-1]==
1)if(j+
1[j+1]==
1)if(i+
11>=
0&&board[i+1]
[j-1]==
1)if(i+
1[j]==1)
if(i+
11[j+1]==
1)if(count<
2&&board[i]
[j]==1)
elseif(
(count==
2||count==3)
&&board[i]
[j]==1)
else
if(count>
3&&board[i]
[j]==1)
else
if(count==
3&&board[i]
[j]==0)
}}for(
int i=
0;i}}
;
官方
class
solution
;int rows = board.
size()
;int cols = board[0]
.size()
;// 建立複製陣列 copyboard
vectorint>
>
copyboard
(rows, vector<
int>
(cols,0)
);// 從原陣列複製乙份到 copyboard 中
for(
int row =
0; row < rows; row++)}
// 遍歷面板每乙個格仔裡的細胞
for(
int row =
0; row < rows; row++)}
}}// 規則 1 或規則 3 if(
(copyboard[row]
[col]==1
)&&(liveneighbors <
2|| liveneighbors >3)
)// 規則 4
if(copyboard[row]
[col]==0
&& liveneighbors ==3)
}}}}
;
第乙個就直接想到暴力法,在原陣列上進行修改會影響後面的值,所以引入了乙個新的陣列。
學會簡化遍歷二維陣列中某個點周圍8個點的方法。官方的更簡潔。
二維陣列八個點訪問方法
1.
const
int dx=
;const
int dy=
;// 獲取周圍的活細胞個數
int cnt =0;
for(
int i =
0; i <
8; i++
)return cnt;
}
int neighbors[3]
=;for(
int i =
0; i <
3; i++)}
}}
leetcode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞周...
Leetcode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞周...
LeetCode 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞具有乙個初始狀態 live 1 即為活細胞,或 dead 0 即為死細胞。每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 根據當前狀態,寫乙個函式來計算面板上細胞的下乙個 一次更新後的 狀態。下乙...