Leetcode--289. 生命游戏
根據(jù)百度百科,生命游戲,簡(jiǎn)稱為生命,是英國(guó)數(shù)學(xué)家約翰·何頓·康威在1970年發(fā)明的細(xì)胞自動(dòng)機(jī)。
給定一個(gè)包含 m × n 個(gè)格子的面板,每一個(gè)格子都可以看成是一個(gè)細(xì)胞。每個(gè)細(xì)胞具有一個(gè)初始狀態(tài) live(1)即為活細(xì)胞, 或 dead(0)即為死細(xì)胞。每個(gè)細(xì)胞與其八個(gè)相鄰位置(水平,垂直,對(duì)角線)的細(xì)胞都遵循以下四條生存定律:
如果活細(xì)胞周圍八個(gè)位置的活細(xì)胞數(shù)少于兩個(gè),則該位置活細(xì)胞死亡;
如果活細(xì)胞周圍八個(gè)位置有兩個(gè)或三個(gè)活細(xì)胞,則該位置活細(xì)胞仍然存活;
如果活細(xì)胞周圍八個(gè)位置有超過(guò)三個(gè)活細(xì)胞,則該位置活細(xì)胞死亡;
如果死細(xì)胞周圍正好有三個(gè)活細(xì)胞,則該位置死細(xì)胞復(fù)活;
根據(jù)當(dāng)前狀態(tài),寫(xiě)一個(gè)函數(shù)來(lái)計(jì)算面板上細(xì)胞的下一個(gè)(一次更新后的)狀態(tài)。下一個(gè)狀態(tài)是通過(guò)將上述規(guī)則同時(shí)應(yīng)用于當(dāng)前狀態(tài)下的每個(gè)細(xì)胞所形成的,其中細(xì)胞的出生和死亡是同時(shí)發(fā)生的。
示例:
輸入:?
[
??[0,1,0],
??[0,0,1],
??[1,1,1],
??[0,0,0]
]
輸出:?
[
??[0,0,0],
??[1,0,1],
??[0,1,1],
??[0,1,0]
]
進(jìn)階:
你可以使用原地算法解決本題嗎?請(qǐng)注意,面板上所有格子需要同時(shí)被更新:你不能先更新某些格子,然后使用它們的更新后的值再更新其他格子。
本題中,我們使用二維數(shù)組來(lái)表示面板。原則上,面板是無(wú)限的,但當(dāng)活細(xì)胞侵占了面板邊界時(shí)會(huì)造成問(wèn)題。你將如何解決這些問(wèn)題?
思路:因?yàn)椴荒芰⒓锤聰?shù)據(jù),因?yàn)楫?dāng)前更新的數(shù)據(jù)會(huì)影響后面值的判斷
因此采用標(biāo)記法
如果該位置值不發(fā)生改變,那么不動(dòng)它
改變的話,-1表示0轉(zhuǎn)1,-2表示1轉(zhuǎn)0
提交的代碼:
class?Solution?{
????public?void?gameOfLife(int[][]?board)?{
????????//-1表示0轉(zhuǎn)1,-2表示1轉(zhuǎn)0
?????????int?sum,i,j;
????????????for(i=0;i<board.length;i++)
????????????{
????????????????
????????????????for(j=0;j<board[0].length;j++)
????????????????{
????????????????????sum=0;
????????????????????if(i-1>=0)
????????????????????{
????????????????????????if(board[i-1][j]==-1||board[i-1][j]==0)
????????????????????????{
????????????????????????????sum+=0;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????sum+=1;
????????????????????????}
????????????????????????if(j-1>=0)
????????????????????????{
????????????????????????????
????????????????????????????if(board[i-1][j-1]==-1||board[i-1][j-1]==0)
????????????????????????????{
????????????????????????????????sum+=0;
????????????????????????????}
????????????????????????????else
????????????????????????????{
????????????????????????????????sum+=1;
????????????????????????????}
????????????????????????}
????????????????????????if(j+1<board[0].length)
????????????????????????{
????????????????????????????if(board[i-1][j+1]==-1||board[i-1][j+1]==0)
????????????????????????????{
????????????????????????????????sum+=0;
????????????????????????????}
????????????????????????????else
????????????????????????????{
????????????????????????????????sum+=1;
????????????????????????????}
????????????????????????}
????????????????????}
????????????????????if(j-1>=0)
????????????????????{
????????????????????????if(board[i][j-1]==-1||board[i][j-1]==0)
????????????????????????{
????????????????????????????sum+=0;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????sum+=1;
????????????????????????}
????????????????????}
????????????????????if(j+1<board[0].length)
????????????????????{
????????????????????????if(board[i][j+1]==-1||board[i][j+1]==0)
????????????????????????{
????????????????????????????sum+=0;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????sum+=1;
????????????????????????}
????????????????????}
????????????????????if(i+1<board.length)
????????????????????{
????????????????????????if(j-1>=0)
????????????????????????{
????????????????????????????if(board[i+1][j-1]==-1||board[i+1][j-1]==0)
????????????????????????????{
????????????????????????????????sum+=0;
????????????????????????????}
????????????????????????????else
????????????????????????????{
????????????????????????????????sum+=1;
????????????????????????????}
????????????????????????}
????????????????????????if(j+1<board[0].length)
????????????????????????{
????????????????????????????if(board[i+1][j+1]==-1||board[i+1][j+1]==0)
????????????????????????????{
????????????????????????????????sum+=0;
????????????????????????????}
????????????????????????????else
????????????????????????????{
????????????????????????????????sum+=1;
????????????????????????????}
????????????????????????}
????????????????????????if(board[i+1][j]==-1||board[i+1][j]==0)
????????????????????????{
????????????????????????????sum+=0;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????sum+=1;
????????????????????????}
????????????????????}
????????????????if(board[i][j]==0)
????????????????{
????????????????????if(sum==3)
????????????????????{
????????????????????????board[i][j]?=?-1;
????????????????????}
????????????????}
????????????????else
????????????????{
????????????????????if(sum==2||sum==3)
????????????????????{
????????????????????????
????????????????????}
????????????????????else
????????????????????{
????????????????????????board[i][j]?=?-2;
????????????????????}
????????????????}
????????????????????
????????????????}
????????????????
????????????}
????????????for(i=0;i<board.length;i++)
????????????{
????????????????for(j=0;j<board[0].length;j++)
????????????????{
????????????????????if(board[i][j]==-1)
????????????????????{
????????????????????????board[i][j]?=?1;
????????????????????}
????????????????????else?if(board[i][j]==-2)
????????????????????{
????????????????????????board[i][j]?=?0;
????????????????????}
????????????????}
????????????}
????}
}
總結(jié)
以上是生活随笔為你收集整理的Leetcode--289. 生命游戏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MySQL小问题:The server
- 下一篇: Kubernetes原理浅析