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);
        }
    }
    

    眼写花了。。

  • 相关阅读:
    C#递归方法把数据表加载到treeview控件(C/S和B/S) 子曰
    ASP.NET 2.0 Web Part编程入门(转) 子曰
    C#中委托的运用 子曰
    window.returnValue使用方法(转) 子曰
    Treevi中的checkbox联动选择,以及Treeview的生成(即选择或取消复选框,其自选框同时选择或取消) 子曰
    发布MicrosoftReportViewer时的问题 子曰
    WCF,Net Remoting,Web service概念和区别 子曰
    使用sql字符串查询关键字CHARINDEX 子曰
    Mysql安装时出现APPLY security settings错误 子曰
    设计模式——单例模式(Singleton)
  • 原文地址:https://www.cnblogs.com/reboot329/p/6288353.html
Copyright © 2011-2022 走看看