LeetCode-289-生命游戏-矩阵-模拟

这段代码展示了两种实现生命游戏的方式。第一种是通过创建新的状态数组res,第二种则是直接在原数组board上进行2dead->alive和3alive->dead的状态转换。代码遍历每个细胞,检查其周围活细胞的数量,根据生命游戏的规则更新细胞状态。
摘要由CSDN通过智能技术生成

原题链接
在这里插入图片描述

代码如下:开个新数组
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        int n = board.size(), m = board[0].size();
        vector<vector<int>> res(n, vector<int>(m));
        int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};

        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++){
                int alive = 0, dead = 0;
                for(int k = 0; k < 8; k ++){
                    int a = i + dx[k], b = j + dy[k];
                    if(a < 0 || a >= n || b < 0 || b >= m)  continue;
                    else if(board[a][b] == 1)
                        alive ++;
                }
                if(board[i][j] == 1 && alive < 2)   res[i][j] = 0;
                else if(board[i][j] == 1 && alive == 2 || alive == 3)   res[i][j] = 1;
                else if(board[i][j] == 1 && alive > 3)  res[i][j] = 0;
                else if(board[i][j] == 0 && alive == 3) res[i][j] = 1;
            }
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
                board[i][j] = res[i][j];
    }
};
代码如下:开个新状态,2 dead -> alive, 3 alive -> dead
class Solution {
public:
    void gameOfLife(vector<vector<int>>& board) {
        int n = board.size(), m = board[0].size();
        vector<vector<int>> res(n, vector<int>(m));
        int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}, dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};

        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++){
                int alive = 0;
                for(int k = 0; k < 8; k ++){
                    int a = i + dx[k], b = j + dy[k];
                    if(a < 0 || a >= n || b < 0 || b >= m)  continue;
                    else if(board[a][b] == 1)   alive ++;
                    else if(board[a][b] == 3)   alive ++;
                }

                //2 dead -> alive, 3 alive -> dead
                if(board[i][j] == 1 && alive < 2)   board[i][j] = 3;
                else if(board[i][j] == 1 && (alive == 2 || alive == 3) )    board[i][j] = 1;
                else if(board[i][j] == 1 && alive > 3)  board[i][j] = 3;
                else if(board[i][j] == 0 && alive == 3) board[i][j] = 2;
                
            }
            
        for(int i = 0; i < n; i ++)
            for(int j = 0; j < m; j ++)
                if(board[i][j] == 2)    board[i][j] = 1;
                else if(board[i][j] == 3)   board[i][j] = 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值