每日一題 生命遊戲(簡易版元胞自動機)

2021-10-04 17:00:14 字數 1765 閱讀 8613

給定乙個包含 m × n 個格仔的面板,每乙個格仔都可以看成是乙個細胞。每個細胞都具有乙個初始狀態:1 即為活細胞(live),或 0 即為死細胞(dead)。每個細胞與其八個相鄰位置(水平,垂直,對角線)的細胞都遵循以下四條生存定律:

如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡;

如果活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活;

如果活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡;

如果死細胞周圍正好有三個活細胞,則該位置死細胞復活;

根據當前狀態,寫乙個函式來計算面板上所有細胞的下乙個(一次更新後的)狀態。下乙個狀態是通過將上述規則同時應用於當前狀態下的每個細胞所形成的,其中細胞的出生和死亡是同時發生的。

思路比較簡單,直接開個輔助陣列模擬就好。

class

solution

;int addy[8]

=;int row =

(int

)temp.

size()

, column =

(int

)temp[0]

.size()

;for

(int i =

0; i < row; i++)}

}if(temp[i]

[j]==

1&& livecells <2)

if(temp[i]

[j]==1&&

(livecells ==

2|| livecells ==3)

)if(temp[i]

[j]==

1&& livecells >3)

if(temp[i]

[j]==

0&& livecells ==3)

}}}}

;

如果要使用in-place演算法的話,想了一下必須要引入額外的狀態。

用2表示下一回合產生的細胞,用3表示下一回合死亡的細胞。然後最後更新一遍棋盤,把所有2都替換成1,把所有3都替換成0即可。

/*

in-place演算法,引入新的狀態;

0表示死亡;

1表示存活;

2表示下一回合產生;

3表示下一回合死亡;

*/class

solution

;int addy[8]

=;int row =

(int

)board.

size()

, column =

(int

)board[0]

.size()

;for

(int i =

0; i < row; i++)}

}if(board[i]

[j]==

1&& livecells <2)

if(board[i]

[j]==1&&

(livecells ==

2|| livecells ==3)

)if(board[i]

[j]==

1&& livecells >3)

if(board[i]

[j]==

0&& livecells ==3)

}}//更新一遍

for(

int i =

0; i < row; i++)if

(board[i]

[j]==3)

}}}}

;

每日一題之 網易遊戲(研發崗)

給你乙個字串,全部都用大寫字母組成,如有按順序排列的連續子串且子串長度大於等於4的時候那就把這種子串表示為開頭的的字元 結尾的字元的形式。比如 xyzabcd 最後轉換為 xyza d 思路 直接模擬,記錄每個子串的起始位置和終止位置 include include include include ...

每日一題 leetcode 55 跳躍遊戲

跳躍遊戲 難度中等647 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最...

每日一題 leetcode 55 跳躍遊戲

跳躍遊戲 難度中等647 給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最...