题目:
根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在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]
]
思路:
此题关键为在计算下一状态时,不能修改现有状态的值,如果修改则会对后面的计算产生影响。
可以先用一个数据结构将要进行的变动存储起来。最后再进行改动
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];
}
};