每日1题_解读细胞生命游戏

生命游戏

在这里插入图片描述
给定一个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死细胞复活
			}
		}
	}
}

饮水思源,力扣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章