leetcode----289. 生命遊戲

題目鏈接------------>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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章