zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    

    眼写花了。。

  • 相关阅读:
    快速开发框架:进销存业务注意事项
    延时执行函数:前浪死在沙滩上
    新增筛选方案
    进销存数据库设计:采购订单
    SasS 设计原则十二因素
    四种线程池的解析
    高并发下的流量控制
    Mybatis 缓存机制
    谈谈JVM垃圾回收
    如何使错误日志更加方便地排查问题
  • 原文地址:https://www.cnblogs.com/reboot329/p/6288353.html
Copyright © 2011-2022 走看看