【leetcode】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;
    }
}```

leetcode 其他解法

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

猜你喜欢

转载自blog.csdn.net/kevin_nan/article/details/87697716