每日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死細胞復活
			}
		}
	}
}

飲水思源,力扣

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