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