LeetCode——生命遊戲

題目:javascript

根據百度百科,生命遊戲,簡稱爲生命,是英國數學家約翰·何頓·康威在1970年發明的細胞自動機。java

給定一個包含 m × n 個格子的面板,每個格子均可以當作是一個細胞。每一個細胞具備一個初始狀態 live(1)即爲活細胞, 或 dead(0)即爲死細胞。每一個細胞與其八個相鄰位置(水平,垂直,對角線)的細胞都遵循如下四條生存定律:數據結構

  1. 若是活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡;
  2. 若是活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活;
  3. 若是活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡;
  4. 若是死細胞周圍正好有三個活細胞,則該位置死細胞復活;

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

示例:code

輸入: 
[
  [0,1,0],
  [0,0,1],
  [1,1,1],
  [0,0,0]
]
輸出: 
[
  [0,0,0],
  [1,0,1],
  [0,1,1],
  [0,1,0]
]

思路:遊戲

此題關鍵爲在計算下一狀態時,不能修改現有狀態的值,若是修改則會對後面的計算產生影響。ip

能夠先用一個數據結構將要進行的變更存儲起來。最後再進行改動get

JS代碼:數學

/**
 * @param {number[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
var gameOfLife = function(board) {
    var newboard = [];
    var i,j;
    
    /**
     * 計算周圍活細胞數
     * 
     * */
    function countLive(i,j,board){
        let count = 0;
        let startX = i - 1 > 0 ? i-1:0;
        let endX = i + 1 < board.length ? i+1:board.length-1;
        let startY = j - 1 > 0 ? j-1:0;
        let endY = j + 1 < board[0].length ? j+1:board[0].length-1;
        // console.log(startX,endX,startY,endY);
        // console.log(board);
        for(let x=startX;x<=endX;x++){
            for(let y = startY;y<=endY;y++){
                if(board[x][y] == 1){
                    // console.log(x,y);
                    if(!(x==i&&y==j)){
                        count ++;
                    }
                    
                }
            }
        }
        // console.log(i,j,count);
        return count;
    }
    for(i=0;i<board.length;i++){
        for(j=0;j<board[0].length;j++){
            var count = countLive(i,j,board);
            if(board[i][j] == 1){
                //周圍活細胞數量在2,3之間 存活
                (count < 2 || count > 3) && (newboard.push([i,j,0]));
                //周圍活細胞數量在2,3以外 死亡
                count >= 2 && count <= 3&&(newboard.push([i,j,1]));
            }else{
                //周圍活細胞數量爲3 復活
                if(count == 3){
                    newboard.push([i,j,1]);
                }else{
                    newboard.push([i,j,0]);
                }
            }
        }
    }
    
    for(i=0;i<newboard.length;i++){
        board[newboard[i][0]][newboard[i][1]] = newboard[i][2];
    }
};