這道題還是比較簡單的,只要針對陣列進行正常遍歷即可。
給定乙個包含 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]
]
高階:
原題url:
因為細胞的出生和死亡是同時發生的
,所以我們在更新時,只能根據上乙個狀態進行判定。
因此,正常思路應該就是複製乙個一模一樣的陣列,然後遍歷這個複製的陣列,進行條件判斷,修改原陣列。
我們來看看**:
class solution
}// 遍歷copyboard,更新board
for (int i = 0; i < copyboard.length; i++)
for (int col = -1; col <= 1 && j + col <= copyboard[i].length - 1; col++)
alivecount += copyboard[i + row][j + col];}}
// 規則1、3
if (alivecount < 2 || alivecount > 3)
// 規則2、4
if ((copyboard[i][j] == 1 && alivecount >= 2 && alivecount <= 3) || (copyboard[i][j] == 0 && alivecount == 3)) }}
}}
提交ok。
因為題目中給出了:用原地演算法解決本題
,所以我們是否可以僅使用原陣列進行解決呢?
肯定是可以的,我們只需要將所有可能的情況都考慮好即可。
所以我們在進行遍歷的時候,需要增加這兩種狀態的判斷,並直接修改原始陣列。看看**:
class solution ;
int rows = board.length;
int cols = board[0].length;
// 遍歷面板每乙個格仔裡的細胞
for (int row = 0; row < rows; row++) }}
}// 規則 1 或規則 3
if ((board[row][col] == 1) && (liveneighbors < 2 || liveneighbors > 3))
// 規則 4
if (board[row][col] == 0 && liveneighbors == 3) }}
// 遍歷 board 得到一次更新後的狀態
for (int row = 0; row < rows; row++) else }}
}}
提交ok,相較於上面的方法,這種解法的空間消耗更少。
以上就是這道題目我的解答過程了,不知道大家是否理解了。這道題主要是針對陣列的處理,外加一些狀態的定義即可。
力扣 289 生命遊戲
給定乙個包含 m n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態 1 即為活細胞 live 或 0 即為死細胞 dead 每個細胞與其八個相鄰位置 水平,垂直,對角線 的細胞都遵循以下四條生存定律 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞...
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 如果周圍細胞數少於兩...