「生命遊戲」是一個細胞自動機的模擬問題。以下是這題的主要內容:
規則如下:
任務是:計算所有細胞同時應用規則後的下一個狀態。
解題關鍵:
一個常見的解法是使用狀態編碼:
這樣可以在原陣列中同時保存舊狀態和新狀態的信息。
class Solution {
public:
void gameOfLife(vector<vector<int>>& board)
{
int m = board.size(), n = board[0].size();
// 狀態:
// 0 -> 目前死的細胞
// 1 -> 目前活的細胞
// 2 -> 目前活的,但即將死亡的細胞
// 3 -> 目前死的,但即將復活的細胞
// 周圍八個格子
vector<vector<int>> directions = {{-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}};
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
// 計算活細胞的數量
int cnt = 0;
// 走訪目標格子的周圍八個格子
for (int k = 0; k < 8; ++k)
{
// 新的 x, y
int x = i + directions[k][0], y = j + directions[k][1];
// 計算活細胞(值為1或2)的數量並存儲在 cnt 中。
if (x >= 0 && x < m && y >= 0 && y < n && (board[x][y] == 1 || board[x][y] == 2))
{
++cnt;
}
}
// 如果細胞目前是活的(board[i][j] == 1)且活鄰居數少於2或多於3,則該細胞將變為死(標記為2)。
if (board[i][j] && (cnt < 2 || cnt > 3))
{
board[i][j] = 2;
}
// 如果細胞目前是死的(board[i][j] == 0)且有正好3個活鄰居,則該細胞將變為活(標記為3)。
else if (!board[i][j] && cnt == 3)
{
board[i][j] = 3;
}
}
}
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
// 標記為2的細胞(原本活的,但應變為死的)會被設置為0。
if (board[i][j] == 2)
{
board[i][j] = 0;
}
// 標記為3的細胞(原本死的,但應變為活的)會被設置為1。
else if (board[i][j] == 3)
{
board[i][j] = 1;
}
}
}
}
};
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up