根據 百度百科 ,生命遊戲,簡稱爲生命,是英國數學家約翰·何頓·康威在 1970 年發明的細胞自動機。
給定一個包含 m × n 個格子的面板,每一個格子都可以看成是一個細胞。每個細胞都具有一個初始狀態:1 即爲活細胞(live),或 0 即爲死細胞(dead)。每個細胞與其八個相鄰位置(水平,垂直,對角線)的細胞都遵循以下四條生存定律:
如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡;
如果活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活;
如果活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡;
如果死細胞周圍正好有三個活細胞,則該位置死細胞復活;
根據當前狀態,寫一個函數來計算面板上所有細胞的下一個(一次更新後的)狀態。下一個狀態是通過將上述規則同時應用於當前狀態下的每個細胞所形成的,其中細胞的出生和死亡是同時發生的。
示例:
輸入:
[
[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]
輸出:
[
[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]
進階:
你可以使用原地算法解決本題嗎?請注意,面板上所有格子需要同時被更新:你不能先更新某些格子,然後使用它們的更新後的值再更新其他格子。
本題中,我們使用二維數組來表示面板。原則上,面板是無限的,但當活細胞侵佔了面板邊界時會造成問題。你將如何解決這些問題?
元胞自動機模擬水題~
class Solution {
public void gameOfLife(int[][] board) {
int n=board.length,m=board[0].length;
int [][]ans=new int[n][m];
int []d={0,-1,1};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int cnt=0;
for(int k1=0;k1<3;k1++)
{
for(int k2=0;k2<3;k2++)
{
if(!(k1==0&&k2==0))
{
int dx=i+d[k1],dy=j+d[k2];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&board[dx][dy]==1)
{
cnt++;
//System.out.println(dx+" "+dy+" "+board[dx][dy]);
}
}
}
}
//System.out.println(i+" "+j+" "+cnt);
if(board[i][j]==0)
{
if(cnt==3)ans[i][j]=1;
else ans[i][j]=0;
}
else
{
if(cnt<2)ans[i][j]=0;
if(cnt==2||cnt==3)ans[i][j]=1;
if(cnt>3)ans[i][j]=0;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
board[i][j]=ans[i][j];
}
}
}
}