力扣289生命遊戲題解

作爲小白,其實基本的問題對我來說都頭大。如何對問題進行一個梳理,從而獲得解決方案。

首先理解一下題意,今天的題目其實很清楚。我們要做的事情其實就是遍歷每個格子,然後判斷該格子的周圍的格子的狀態,然後利用格子的狀態以及周圍格子的狀態,根據給定的規則來改變格子的狀態。

因爲現有的格子的狀態改變,可能會影響其他格子在本輪的狀態判斷,因此我們需要複製一個數組。
本題的思路可以簡要描述如圖:
image.png

這裏其實就是要學會分而治之,一個個切分爲子問題,然後逐個擊破。這裏有一個要學習的技巧是利用一個neibors數組來實現對格子周圍數組的查找。這個很巧妙,見過了要記住。
代碼如下:

class Solution {
public:
     
    void gameOfLife(vector<vector<int>>& board) {
       
       int hang=board.size();
       if(hang==0)return;
       int lie=board[0].size();
       if(lie==0)return ;
       vector<vector<int>> mboard(hang,vector<int>(lie,0));
       for(int i=0;i<hang;i++)
       {
           for(int j=0;j<lie;j++)
           {
               mboard[i][j]=board[i][j];
           }
       }//做一個數組的複製
       int neibors[]={-1,0,1};//用於找周圍的節點用,可以看到這其實就//是定義了查找行走的方向
       

       for(int hi=0;hi<hang;hi++)
       {
           for(int li=0;li<lie;li++)
           {//這是一個外層的大遍歷,實現對每個格子都走一遍
                int livelife=0;//對每個格子要判斷旁邊的livelife
                for(int i=0;i<3;i++)//這是利用neibprs數組來看周圍
//格子的狀態
                {
                    for(int j=0;j<3;j++)
                    {
                        if(!(neibors[i]==0&&neibors[j]==0))
                        {
                            int hh=hi+neibors[i];
                            int ll=li+neibors[j];
                            if(hh>=0&&hh<hang&&ll>=0&&ll<lie&&                              mboard[hh][ll]==1)livelife++;

                        }
                        
                    }
                }
                if(mboard[hi][li]==1)
                {
                    if(livelife<2||livelife>3)board[hi][li]=0;
                    
                }else{
                    if(livelife==3)board[hi][li]=1;
                }
           }
       }

    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章