LeetCode——生命游戏

题目:

根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。

给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞具有一个初始状态 live(1)即为活细胞, 或 dead(0)即为死细胞。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:

  1. 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
  2. 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
  3. 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
  4. 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;

根据当前状态,写一个函数来计算面板上细胞的下一个(一次更新后的)状态。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。

示例:

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

思路:

此题关键为在计算下一状态时,不能修改现有状态的值,如果修改则会对后面的计算产生影响。

可以先用一个数据结构将要进行的变动存储起来。最后再进行改动

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];
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值