作爲小白,其實基本的問題對我來說都頭大。如何對問題進行一個梳理,從而獲得解決方案。
首先理解一下題意,今天的題目其實很清楚。我們要做的事情其實就是遍歷每個格子,然後判斷該格子的周圍的格子的狀態,然後利用格子的狀態以及周圍格子的狀態,根據給定的規則來改變格子的狀態。
因爲現有的格子的狀態改變,可能會影響其他格子在本輪的狀態判斷,因此我們需要複製一個數組。
本題的思路可以簡要描述如圖:
這裏其實就是要學會分而治之,一個個切分爲子問題,然後逐個擊破。這裏有一個要學習的技巧是利用一個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;
}
}
}
}
};