289.⽣命游戏(JS实现)
1 题⽬
根据 百度百科 ,⽣命游戏,简称为⽣命,是英国数学家约翰·何顿·康威在 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]
]
进阶:
你可以使⽤原地算法解决本题吗?请注意,⾯板上所有格⼦需要同时被更新:你不能先更新某些格⼦,然后使⽤它们的更新后的值再更新其他格⼦。
本题中,我们使⽤⼆维数组来表⽰⾯板。原则上,⾯板是⽆限的,但当活细胞侵占了⾯板边界时会造成问题。你将如何解决这些问题?
2 思路
⾸先我们遍历整个矩阵,如果某细胞是活的,那么给周围8个位置细胞都加上影响因⼦10,然后我们第
⼆次遍历矩阵,根据每个细胞的影响因⼦数来更新细胞的状态
3代码
/**
* @param {number[][]} board
* @return {void} Do not return anything, modify board in-place instead. */
var gameOfLife=function(board){
let m = board.length;
let n = board[0].length;
function affect(i,j){
if(board[i][j]%10===0)return;
for(let x=i-1; x<=i+1; x++){
for(let y=j-1; y<=j+1; y++){
if(x === i && y === j || x <0|| y <0|| x >= m || y >= n)continue;                board[x][y]+=10;
}
}
}
js 二维数组function caculte(i,j){
let num = board[i][j];
let k = Math.floor(num /10);
if(num %10===0){
if( k ===3){
board[i][j]=1;
}else{
board[i][j]=0;
}
}else{
if(k <2|| k >3){
board[i][j]=0;
}else{
board[i][j]=1;
}
}
}
for(let i=0; i<m; i++){
for(let j=0; j<n; j++){
affect(i,j);
}
}
for(let i=0; i<m; i++){
for(let j=0; j<n; j++){
caculte(i,j);
}
}
};

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。