生命遊戲
給定一個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死細胞復活
}
}
}
}
飲水思源,力扣