zoukankan      html  css  js  c++  java
  • 289.Game of life 生命游戏


    题目, 我觉得最简单的方法就是用四个for循环把他解出来,一个一个枚举,用两个矩阵进行保存

    public class Main {
    	public void gameOfLife(int[][] board) {
    		int length = board.length;// 得到数组的长
    		int wide = board[0].length;// 得到数组的宽
    		int[][] temp = new int[length][wide];// 用于存放新的状态
    		for (int i = 0; i < length; i++) {//一个一个分情况看
    			for (int x = 0; x < wide; x++) {
    				int sum;
    				if (board[i][x] == 1) {
    					sum = -1;
    				} else
    					sum = 0;// 记录八个邻居有几个活细胞
    				for (int t1 = i - 1; t1 <= i + 1; t1++) {// for循环不能放太多if条件 不然会让程序出错
    					for (int t2 = x - 1; t2 <= x + 1; t2++) {
    						if (t1 > -1 && t1 < length) {//一开始将条件 放在for 循环里面,导致答案出错
    							if (t2 > -1 && t2 < wide) {
    								if (board[t1][t2] != 0) {
    									sum++;
    								}
    							}
    						}
    					}
    				}
    				if (sum < 2) {//条件分析
    					temp[i][x] = 0;
    				} else if (sum == 2) {
    					temp[i][x] = board[i][x];
    				} else if (sum == 3) {
    					temp[i][x] = 1;
    				} else if (sum > 3) {
    					temp[i][x] = 0;
    				}
    			}
    		}
    		for (int i = 0; i < length; i++) {//一个一个读回去
    			for (int x = 0; x < wide; x++) {
    				board[i][x] = temp[i][x];
    			}
    		}
    	}
    	public static void main(String[] args) {//测试用例
    		Main m = new Main();
    		int arr[][] = { { 0, 1, 0 }, { 0, 0, 1 }, { 1, 1, 1 }, { 0, 0, 0 } };
    		m.gameOfLife(arr);
    		for (int i = 0; i < arr.length; i++) {
    			for (int x = 0; x < arr[0].length; x++) {
    				System.out.print(arr[i][x]);
    			}
    			System.out.println();
    		}
    	}
    }
    

    其他人的解法

    class Solution {
        //第一遍遍历,将1并且周围有两个或三个1的位置设为-1,-1表示这个位置细胞是死的,先设为-1,后面再设为0
        //第二遍遍历,将0并且周围有三个1的位置设为2,2表示这个位置细胞是活的,先设为2,后面再设为1
        //第三遍遍历,将所有-1设为0,所有2设为1
        //计算周围活着的细胞个数时,取1或-1的绝对值
    //将值换的话 需要不影响其他值 ,该解法也做到这一点 将值替换成其他数 
        public void gameOfLife(int[][] board) {
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    int count = count(board, i, j);
                    if (board[i][j] == 1 && count != 2 && count != 3) {
                        board[i][j] = -1;
                    }
                }
            }
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    int count = count(board, i, j);
                    if (board[i][j] == 0 && count == 3) {
                        board[i][j] = 2;
                    }
                }
            }
            for (int i = 0; i < board.length; i++) {
                for (int j = 0; j < board[0].length; j++) {
                    if (board[i][j] == -1) {
                        board[i][j] = 0;
                    }else if(board[i][j] == 2) {
                        board[i][j] = 1;
                    }
                }
            }
        }
     
        private int count(int[][] board, int row, int col) {统计周围有几个活细胞
            int liveAround = 0;
            int rowMax = row + 1 > board.length - 1 ? board.length - 1 : row + 1;
            int colMax = col + 1 > board[0].length - 1 ? board[0].length - 1 : col + 1;
            int rowMin = row - 1 < 0 ? 0 : row - 1;
            int colMin = col - 1 < 0 ? 0 : col - 1;
            for (int i = rowMin; i >= 0 && i <= rowMax; i++) {
                for (int j = colMin; j >= 0 && j <= colMax; j++) {
                    if (!(row == i && col == j) && Math.abs(board[i][j]) == 1) {
                        liveAround++;
                    }
                }
            }
            return liveAround;
        }
    }
    
    public void gameOfLife(int[][] board) {
        if (board == null || board.length == 0) return;
        int m = board.length, n = board[0].length;
     
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int lives = liveNeighbors(board, m, n, i, j);
     
                // In the beginning, every 2nd bit is 0;
                // So we only need to care about when will the 2nd bit become 1.
                if (board[i][j] == 1 && lives >= 2 && lives <= 3) {  
                    board[i][j] = 3; // Make the 2nd bit 1: 01 ---> 11
                }
                if (board[i][j] == 0 && lives == 3) {
                    board[i][j] = 2; // Make the 2nd bit 1: 00 ---> 10
                }
            }
        }
     
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                board[i][j] >>= 1;  // Get the 2nd state.
            }
        }
    }
     
    public int liveNeighbors(int[][] board, int m, int n, int i, int j) {
        int lives = 0;
        for (int x = Math.max(i - 1, 0); x <= Math.min(i + 1, m - 1); x++) {
            for (int y = Math.max(j - 1, 0); y <= Math.min(j + 1, n - 1); y++) {
                lives += board[x][y] & 1;
            }
        }
        lives -= board[i][j] & 1;
        return lives;
    }
    
  • 相关阅读:
    SPOJ AMR12B 720
    OUC_TeamTraining_#1 720
    Mac下安装必须软件
    spawn命令和expect
    python基础
    AndroidManifest.xml详解
    Ubuntu系统连接Android真机调试
    Android Studio 快捷键
    linux 解压/压缩命令
    sadasd
  • 原文地址:https://www.cnblogs.com/cznczai/p/11149779.html
Copyright © 2011-2022 走看看