Leetcode——生命游戏

题目描述

Leetcode——生命游戏_第1张图片
Leetcode——生命游戏_第2张图片

题目解析

  • 本题是用一个二维数组保存细胞,细胞的死活跟当前数组里的值有关。
  • 如果按照正常做法去更新每一个而不使用辅助数组时,就无法满足题目要求,我们应该对数组进行同步更新。
  • 我们应该保存两个状态,一个是更新前的状态,一个是更新后的状态。那么我们可以用十位数来保存更新后的状态,个位数保存更新前状态。
  • 刚看到这道题第一想法应该是去遍历每个位置周围,存下1的数目来更新,但在评论区借鉴了某位大神的思路,我们可以遍历各个位置,而各个位置活着的细胞会辐射影响周围的位置,使得周围的位置都加上10。
  • 而对于判断的问题,我们可以分出细胞存活的情况有两种,分别是更新前活着并且周围只有2或3个活细胞,即21和31的时候和更新前死去但周围刚好有3个活细胞而复活的情况,即30的时候。

题目解答

class Solution {
    public void gameOfLife(int[][] board) {
        int r=board.length;
        int c=board[0].length;

        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                if(board[i][j]%10==1)
                    check(board,i,j);
            }
        }
        for(int a=0;a<r;a++){
            for(int b=0;b<c;b++){
                calculate(board,a,b);
            }
        }
    }
    //判断细胞是否还存活
    private static void calculate(int[][] board,int m,int n){
        int value=board[m][n];
        //数组所存值为30/31时存活
        if(value/10==3) board[m][n]=1;
        //数组所存值为21时存活
        else if(value/10==2&&value%10==1) board[m][n]=1;
        else board[m][n]=0;
    }
    //往8个方向搜索,不出界就给他加上10
    private static void check(int[][] board,int m,int n){
        int i,j;
        int[] neighbors={1,0,-1};
        for(int a=0;a<3;a++){
            for(int b=0;b<3;b++){
                i=m;
                j=n;
                i+=neighbors[a];
                j+=neighbors[b];
                if(i<0||i>=board.length||j<0||j>=board[0].length||(i==m&&j==n))
                    continue;
                board[i][j]+=10;
            }
        }
    } 
}

你可能感兴趣的:(LeetCode)