題目鏈接------------>289. 生命遊戲
這道題我們按照題目的描述模擬細胞狀態變化就可以了,由於是每個細胞根據周圍的細胞狀態進行變換,並且題目要求所有細胞的狀態是同時變換的,所以我們需要一個新的二維數組來存放細胞最初始的狀態。
void gameOfLife(vector<vector<int>>& board) {
int n = board.size(),m = board[0].size(),live = 0;
int fxy[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
vector<vector<int>> num(board.begin(),board.end());
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
live = 0;
for(int k = 0;k < 8;k++)
{
int x = i + fxy[k][0];
int y = j + fxy[k][1];
if(x >= 0 && x < n && y >= 0 && y < m && num[x][y] == 1)
live++;
}
if(num[i][j] == 0 && live == 3)
board[i][j] = 1;
if(num[i][j] == 1)
{
if(live < 2)
board[i][j] = 0;
else if(live > 3)
board[i][j] = 0;
}
}
}
}
對於上述代碼我們可以對空間複雜度再優化,細胞的狀態只有0和1,我們完全可以使用一個比特位來描述細胞的狀態,題目所給數組單元爲int類型,一個int有32位,我們用其第二位來描述新的細胞狀態,最後再將第二位移到第一位來實現細胞狀態更新。
void gameOfLife(vector<vector<int>>& board) {
int n = board.size(),m = board[0].size(),live = 0;
int fxy[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
live = 0;
for(int k = 0;k < 8;k++)
{
int x = i + fxy[k][0];
int y = j + fxy[k][1];
if(x >= 0 && x < n && y >= 0 && y < m && (board[x][y] & 1) == 1)
live++;
}
if((board[i][j] & 1) == 0 && live == 3)
board[i][j] |= 2;
if((board[i][j] & 1) == 1 && (live == 2 || live == 3))
{
board[i][j] |= 2;
}
}
}
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
board[i][j] >>= 1;
}
}
}