leetcode 289. Game of Life

本文介绍了一种解决LeetCode上289题生命游戏的有效方法,通过使用两个bit来表示前后两次状态的变化,巧妙地更新矩阵中细胞的状态。文章提供了完整的Java代码实现,并详细解释了如何计算周围活细胞的数量以及如何根据生命游戏规则更新每个细胞的状态。

leetcode 289. Game of Life

谷歌的面试题果然很开眼界,比如这题,用两bit来表示前后两次的状态,很巧妙。

public class Solution {
    public void gameOfLife(int[][] board) {
        if(board==null||board.length==0) return;
        int m = board.length;
        int n = board[0].length;
        // if(n==0) return;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                int lives = getlivesaround(board,m,n,i,j);
                if(board[i][j]==1&&(lives==2||lives==3)){
                    board[i][j] = 3; // 11<-01
                }
                if(board[i][j]==0&&lives==3){
                    board[i][j] = 2;  // 10<-00
                }
            }
        }
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                board[i][j] = board[i][j]>>1;
            }
        }
        
    }
    
    private int getlivesaround(int[][] board, int m, int n, int i, int j){
        int lives = 0;
        for(int h = Math.max(i-1,0);h <= Math.min(i+1, m-1);h++){
            for(int k = Math.max(j-1,0);k <= Math.min(j+1, n-1);k++){
                lives += board[h][k]&1;
            }
        }
        lives -= board[i][j]&1;
        return lives;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值