289. Game of Life

最后更新

二刷
15-Jan-2017

用右起第二位来表示更新结果,这样最右位依然可以用来判断。

最后再遍历一次全部更新就行了。

做得好傻逼,应该可以用1 0 -1 0 1这样滚动来做。

Time: O(MN)
Space: O(1)

public class Solution {
    public void gameOfLife(int[][] board) {
        // <2 dead
        // 2/3 live
        // > 3 dead
        // dead with 3 => live
        
        if (board.length == 0) return;
        
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                check(i, j, board);
            }
        }
        
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {
                if ((board[i][j] & (1<<1)) != 0) {
                    board[i][j] = 1;
                } else {
                    board[i][j] = 0;
                }
            }
        }
        
        return;
    }
    
    public void check(int i, int j, int[][] board) {
        
        int live = 0;
        
        if (i > 0 && (board[i-1][j] & 1) == 1) live++;
        if (j > 0 && (board[i][j-1] & 1) == 1) live++;
        if (i < board.length-1 && (board[i+1][j] & 1) == 1) live++;
        if (j < board[0].length-1 && (board[i][j+1] & 1) == 1) live++;
        
        if (i > 0 && j > 0 && (board[i-1][j-1]&1) == 1) live++;
        if (i < board.length-1 && j < board[0].length-1 && (board[i+1][j+1]&1) == 1) live++;
        
        if (i > 0 && j < board[0].length-1 && (board[i-1][j+1]&1) == 1) live++;
        if (i < board.length-1 && j > 0 && (board[i+1][j-1]&1) == 1) live++;
        
        if(board[i][j] == 1 && live < 2) board[i][j] |= (0<<1);
        else if(board[i][j] == 1 && (live == 2 || live == 3)) board[i][j] |= (1<<1);
        else if(board[i][j] == 0 && live == 3) board[i][j] |= (1<<1);
        else board[i][j] |= (0<<1);
        
        
    }
}

一刷

02-Sep-2016

根据邻居的情况决定自己下回合啥屌样。

要求一次性更新,不能说第一排更新完了用更新的结果去更新第二排。

所以要重新弄个期盼记录下回合啥样,最后一起更新。

然后要求in-place,不能用第二个棋盘了。

因为0是死,1是活,1 bit就能表示,所以不妨用另一个bit表示结果,判断只用第一个bit判断。

最后重新遍历期盼,根据另一个bit改写最后生死状况。
做起来方法很多,但是思路大致就这样了。

public class Solution {
    public void gameOfLife(int[][] board) {
        
        for(int i = 0; i < board.length;i++)
        {
            for(int j = 0; j < board[0].length;j++)
            {
                change(board,i,j);
            }
        }
        
        for(int i = 0; i < board.length;i++)
            for(int j = 0; j < board[0].length;j++)
            {
                if((board[i][j] & (1<<1)) != 0) board[i][j] = 1;
                else board[i][j] = 0;
            }
            
        
    }
    
    public void change(int[][] board,int m,int n)
    {
        int count = 0;
        if(m>0 && n >0 && ((board[m-1][n-1] & 1)==1)) count++;
        if(m>0 && ((board[m-1][n] & 1)==1)) count++;
        if(m>0 && n<board[0].length-1 && ((board[m-1][n+1] & 1) == 1)) count++;
        if(n < board[0].length-1 && ((board[m][n+1] & 1) == 1)) count++;
        if(m<board.length-1 && n<board[0].length-1 && ((board[m+1][n+1] & 1)==1)) count++;
        if(m<board.length-1 && ((board[m+1][n] & 1) == 1)) count++;
        if(m<board.length-1 && n > 0 && ((board[m+1][n-1] & 1) == 1)) count++;
        if(n>0 && ((board[m][n-1] & 1) == 1)) count++;
        
        if(board[m][n] == 1 && count < 2) board[m][n] |= (0<<1);
        else if(board[m][n] == 1 && (count == 2 || count == 3)) board[m][n] |= (1<<1);
        else if(board[m][n] == 0 && count == 3) board[m][n] |= (1<<1);
        else board[m][n] |= (0<<1);
    }
}

眼写花了。。

posted @ 2017-01-16 03:05  哇呀呀..生气啦~  阅读(312)  评论(0编辑  收藏  举报