生命游戏00

2023-12-26 16:57:22

题目链接

生命游戏

题目描述



注意点

  • board[i][j] 为 0 或 1
  • 细胞的出生和死亡是同时发生的
  • 返回下一个状态

解答思路

  • 根据规则更新细胞下一次的状态,但是要保证如果更新了某个细胞的状态,在其他细胞由该细胞状态决定状态时,应该取当前的状态(而非下一次的状态)
  • 如果想要原地算法解决本题,关键是要找到哪些细胞由0->1或1->0,且不能直接进行更新,而是应该额外用一个状态来标记该状态,本次解法使用2表示由0->1,用3表示由1->0,最终再根据这些状态更新board即可

代码

class Solution {
    public void gameOfLife(int[][] board) {
        int[][] direction = {
            {-1, -1}, {-1, 0}, {-1, 1},
            {0, -1}, {0, 1}, 
            {1, -1}, {1, 0}, {1, 1}};
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                int sum = 0;
                for (int x = 0; x < direction.length; x++) {
                    sum += isAliveCell(board, i + direction[x][0], j + direction[x][1]);
                }
                if (board[i][j] == 0 && sum == 3) {
                    board[i][j] = 2;
                }
                if (board[i][j] == 1 && (sum < 2 || sum > 3)) {
                    board[i][j] = 3;
                }
            }
        }
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if (board[i][j] == 2) {
                    board[i][j] = 1;
                }
                if (board[i][j] == 3) {
                    board[i][j] = 0;
                }
            }
        }
    }

    public int isAliveCell(int[][] board, int i, int j) {
        if (i < 0 || j < 0 || i >= board.length || j >= board[0].length) {
            return 0;
        }
        if (board[i][j] == 1 || board[i][j] == 3) {
            return 1;
        }
        return 0;
    }
}

关键点

文章来源:https://blog.csdn.net/weixin_51628158/article/details/135214957
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。