生命游戏
给定一个m*n格子的面板,每一个格子存在一个细胞。
细胞的状态:1(活细胞live)、0(死细胞die)
对于每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞存在生存规律
- 周围八个位置的活细胞个数少于2,该位置的活细胞死亡
- 周围八个位置的活细胞个数为2或3,该位置的活细胞仍然存活
- 周围八个位置的活细胞个数大于3,该位置的活细胞死亡
- 周围八个位置的活细胞个数等于3,该位置死细胞复活
写一个函数计算面板上的所有细胞跟新一次的状态
注意
所有的细胞同时更新,通常需要复制一层细胞数据
#include<iostream>
#include<vector>
using namespace std;
void gameLife(vector<vector<int>> &board)
{
int rows = board.size();
int cols = board[0].size();//拿出行列数rows*cols
vector<vector<int>> copyBoard(rows, vector<int>(cols, 0));//定义rows*rols的二维数组复制原来的数组
for (int row = 0; row < rows; ++row)
{
for (int col = 0; col < cols; ++col)
{
copyBoard[row][col] = board[row][col];//原样复制
}
}
//遍历周围的每一个格子行列下标需要+1,+0,-1
int neighbors[3] = { 0,1,-1 };//行列下标处理
for (int row = 0; row < rows; ++row)//遍历
{
for (int col = 0; col < cols; ++col)//所有细胞都进行判断
{
int LiveNeighbors = 0;//记录存活细胞个数
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)//最多周围九个元素
{
if (!(neighbors[i] == 0 && neighbors[j] == 0))//同时+0是自身不用判断
{
int r = row + neighbors[i];//对行下标进行+1+0-1
int c = col + neighbors[j];//对列下标进行+1+0-1
if ((r < rows&&r >= 0) && (c < cols&&c >= 0) && (copyBoard[r][c] == 1))//周围八个行列下标是否存在
{
++LiveNeighbors;//存活细胞个数+1
}
}
}
}//记录数据完成
//游戏规则判断,需要更新的情况
if ((copyBoard[row][col] == 1) && (LiveNeighbors < 2 || LiveNeighbors>3))
{
board[row][col] = 0;//小于2或则大于3导致活细胞死亡
}
if ((copyBoard[row][col] == 0) && (LiveNeighbors == 3))
{
board[row][col] = 1;//为3死细胞复活
}
}
}
}
饮水思源,力扣