289. 生命游戏 原地数组解决
程序员文章站
2024-01-22 11:11:34
...
前言
此题????解法还是想了一段时间,可以利用高4位来存储信息。为了方便代码使用16进制位操作
记
0x0000 4个字节,每个字节8位, 这表示一个int数据
0x0001 生命游戏当前状态
0x0010 倒数第二个8位为生命游戏下一个状态。
当然也可以使用二进制 01、10
题目描述
思路
伪代码
遍历整个数组,
判断8邻域内1的个数
根据个数决定下一个状态。
遍历数组转换下一个状态
代码
class Solution {
public:
void change(vector<vector<int>>& board,int x,int y)
{
int count=0;
for(int i=x-1;i<=x+1;i++)
{
for(int j=y-1;j<=y+1;j++)
{
//边界条件
if(i<0||j<0||i>=board.size()||j>=board[0].size()||(i==x&&j==y))
continue;
count += board[i][j] & 0x0001;
}
}
if((board[x][y] & 0x0001) ==1)
{
cout<<count;
if(count<2||count>3)
board[x][y] &= 0x0001;
else
board[x][y] |= 0x0010;
}else
{
if(count==3)
{
board[x][y] |= 0x0010;
}
}
}
void gameOfLife(vector<vector<int>>& board) {
for(int i=0;i<board.size();i++)
for(int j=0;j<board[0].size();j++)
{
change(board,i,j);
}
for(int i=0;i<board.size();i++)
for(int j=0;j<board[0].size();j++)
{
board[i][j] >>= 4;
}
}
};