欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

289. 生命游戏 原地数组解决

程序员文章站 2024-01-22 11:11:34
...

前言

此题????解法还是想了一段时间,可以利用高4位来存储信息。为了方便代码使用16进制位操作

0x0000 4个字节,每个字节8位, 这表示一个int数据
0x0001 生命游戏当前状态
0x0010 倒数第二个8位为生命游戏下一个状态。
当然也可以使用二进制 01、10

题目描述

289. 生命游戏 原地数组解决
题目链接

思路

伪代码
遍历整个数组,

判断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;
        }
    }
};