原题
思路
这个因为是瞬时变化,要变一起变,所以不能在原数组上操作。
NEW一个新的数组,然后循环判断,左上,上,右上,左,右,左下,下,右下。
再根据条件进行判断是生是死。
代码一把过,本来感觉可能要执行的很慢,结果是击败百分之百,很开心。
代码
package leetcode.Algorithms;
public class Solution_289 {
public static void main(String[] args) {
int[][] board = {{0, 1, 0}, {0, 0, 1}, {1, 1, 1}, {0, 0, 0}};
gameOfLife(board);
}
public static void gameOfLife(int[][] board) {
int[][] copy = new int[board.length][board[0].length];
int x = board.length;
int y = board[0].length;
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
int livecount = 0;
//左上角
if (i - 1 >= 0 && j - 1 >= 0) {
if (board[i - 1][j - 1] > 0) {
livecount++;
}
}
//中上
if (i - 1 >= 0) {
if (board[i - 1][j] > 0) {
livecount++;
}
}
//右上
if (i - 1 >= 0 && j + 1 < y) {
if (board[i - 1][j + 1] > 0) {
livecount++;
}
}
//左
if (j - 1 >= 0) {
if (board[i][j - 1] > 0) {
livecount++;
}
}
//右
if (j + 1 < y) {
if (board[i][j + 1] > 0) {
livecount++;
}
}
//左下
if (i + 1 < x && j - 1 >= 0) {
if (board[i + 1][j - 1] > 0) {
livecount++;
}
}
//下
if (i + 1 < x) {
if (board[i + 1][j] > 0) {
livecount++;
}
}
//右下
if (i + 1 < x && j + 1 < y) {
if (board[i + 1][j + 1] > 0) {
livecount++;
}
}
// * 如果活细胞周围八个位置的活细胞数少于两个,则该位置活细胞死亡;
// * 如果活细胞周围八个位置有两个或三个活细胞,则该位置活细胞仍然存活;
// * 如果活细胞周围八个位置有超过三个活细胞,则该位置活细胞死亡;
// * 如果死细胞周围正好有三个活细胞,则该位置死细胞复活;
if (livecount > 3) {
copy[i][j] = 0;
} else if (livecount < 2) {
copy[i][j] = 0;
} else if (livecount == 3 && board[i][j] == 0) {
copy[i][j] = 1;
} else if ((livecount == 2 || livecount == 3) && board[i][j] == 1) {
copy[i][j] = 1;
}
}
}
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
board[i][j] = copy[i][j];
}
}
}
}