289. Game of Life

37 篇文章 0 订阅

这道题和前一篇博客的题有一定的相似之处,都是要求处理矩阵,都要进行矩阵的0,1变换,都要在原地完成,空间复杂度是O(1),时间复杂度要求是O(mn),难点就在空间复杂度是O(1)这里,因为要求不能使用更新过的数值去更新以他元素,因此,需要在原表中记录前后两个状态。

其实,在矩阵中,每一个位置的数值变化分为有两种状态,变或者不变,独营的,每个位置上的数值也有两种,0或者1,这就使得二维矩阵中的数值变化操作分为4种,0到0, 0到1, 1到0,1到1,将上述四种状态分别用 00 (0),01 (1), 10 (2), 11(3),这样就解决了上述问题,当遇到0和2时,说明初始状态是0,遇到1,3时,说明初始状态是1,同样的,遇到0,1时,改变后的状态是0, 遇到2,3时,改变后的状态是1,当然,可以采用取余和移位等操作来减小if语句的数量,提高代码的精简程度。具体的操作见代码:

 

class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[i].size(); ++j) {
                int roundCell = 0;
                for (int m=-1; m<2; ++m) {
                    for (int n=-1; n<2; ++n) {
                        if ((!m && !n) || (i+m<0 || i+m>=board.size() || j+n<0 || j+n>=board[0].size())) {
                            continue;
                        } else if(board[i+m][j+n] % 2) {
                            ++roundCell;
                        }
                    }
                }
                if(board[i][j]){
                    if (roundCell==2 || roundCell==3) {
                        board[i][j] = 3;
                    }
                } else {
                    if (roundCell == 3) {
                        board[i][j] = 2;
                    }
                }
            }
        }
        
        for (int i=0; i<board.size(); ++i) {
            for (int j=0; j<board[i].size(); ++j) {
                board[i][j] = board[i][j]>>1;
            }
        }
    }
};

 

以下是Game of Life的C++代码示例: ```cpp #include <iostream> #include <vector> #include <chrono> #include <thread> #include <cstdlib> using namespace std; class GameOfLife { private: vector<vector<int>> grid; int rows, columns; public: GameOfLife(int r, int c) : rows(r), columns(c) { grid.resize(rows, vector<int>(columns, 0)); } void initialize() { srand(time(NULL)); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { grid[i][j] = rand() % 2; } } } int getNeighbourCount(int row, int col) { int count = 0; for (int i = -1; i <= 1; i++) { for (int j = -1; j <= 1; j++) { int r = row + i; int c = col + j; if (r >= 0 && r < rows && c >= 0 && c < columns && !(i == 0 && j == 0)) { count += grid[r][c]; } } } return count; } void nextGeneration() { vector<vector<int>> newGrid(rows, vector<int>(columns, 0)); for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { int neighbourCount = getNeighbourCount(i, j); if (grid[i][j] == 0 && neighbourCount == 3) { newGrid[i][j] = 1; } else if (grid[i][j] == 1 && (neighbourCount == 2 || neighbourCount == 3)) { newGrid[i][j] = 1; } else { newGrid[i][j] = 0; } } } grid = newGrid; } void print() { for (int i = 0; i < rows; i++) { for (int j = 0; j < columns; j++) { if (grid[i][j] == 1) { cout << "* "; } else { cout << ". "; } } cout << endl; } } }; int main() { int rows = 40, columns = 40; GameOfLife gol(rows, columns); gol.initialize(); while (true) { gol.print(); gol.nextGeneration(); this_thread::sleep_for(chrono::milliseconds(100)); system("clear"); } return 0; } ``` 此代码实现了一个Game of Life模拟器,它使用随机值初始化单元格,并在每次迭代中计算每个单元格周围的邻居数量,然后使用规则进行更新。最后,它在控制台中打印游戏板并在每次迭代后清除屏幕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值