https://leetcode-cn.com/problems/game-of-life/
最笨的方法,不过要考虑全面。
首先,要考虑到可能二维中至少有一维是0的,比如3行0列的:[[],[],[]],或者说0行3列的:当然还有可能都是0,比如[]。
之后考虑每一维是大于1的,这就需要几个标记了:1活,0死,-1死->活,2活->死。
只有一行一列的时候,很简单,改一行或者一列就行
维数都大于1的时候,需要考虑的是,内层(除了边界),四个角,四个边(除了角),逐类变化。
/*
*作者@v7fgg
*执行用时 :0 ms, 在所有 Java 提交中击败了100.00%的用户
*内存消耗 :38 MB, 在所有 Java 提交中击败了11.11%的用户
*2020年6月11日 13:36
*/
class Solution {
public void gameOfLife(int[][] board) {
//1活,0死,-1死->活,2活->死
int chang=board.length;
//0行的不用考虑,反正啥也没有
//考虑只有一行的
if(chang==1&&board[0].length>0){
if(board[0][0]==1){
board[0][0]=2;
}
if(board[0][board[0].length-1]==1){
board[0][board[0].length-1]=2;
}
for(int j=1;j<board[0].length-1;j++){
if(board[0][j]>0&&(board[0][j-1]==0||board[0][j+1]==0)){
board[0][j]=2;
}
}
for(int j=0;j<board[0].length;j++){
if(board[0][j]==2){
board[0][j]=0;
}
}
}
else if(chang>1){
int kuan=board[0].length;
//考虑只有一列的
if(kuan==1){
if(board[0][0]==1){
board[0][0]=2;
}
if(board[board.length-1][0]==1){
board[board.length-1][0]=2;
}
for(int i=1;i<chang-1;i++){
if(board[i][0]>0&&(board[i-1][0]==0||board[i+1][0]==0)){
board[i][0]=2;
}
}
for(int i=0;i<chang;i++){
if(board[i][0]==2){
board[i][0]=0;
}
}
}
else if(kuan>1){
//先考虑内层的,即不在边界的元组
for(int i=1;i<chang-1;i++){
for(int j=1;j<kuan-1;j++){
int huo=0;
if(board[i+1][j]>0){huo++;}
if(board[i-1][j]>0){huo++;}
if(board[i+1][j+1]>0){huo++;}
if(board[i+1][j-1]>0){huo++;}
if(board[i-1][j+1]>0){huo++;}
if(board[i-1][j-1]>0){huo++;}
if(board[i][j+1]>0){huo++;}
if(board[i][j-1]>0){huo++;}
if(board[i][j]>0){
if(huo!=3&&huo!=2){board[i][j]=2;}
}
else if(huo==3){board[i][j]=-1;}
}
}
//上边界(不含角)
for(int j=1;j<kuan-1;j++){
int huo=0;
if(board[0][j-1]>0){huo++;}
if(board[0][j+1]>0){huo++;}
if(board[1][j+1]>0){huo++;}
if(board[1][j-1]>0){huo++;}
if(board[1][j]>0){huo++;}
if(board[0][j]>0){
if(huo!=3&&huo!=2){board[0][j]=2;}
}
else if(huo==3){board[0][j]=-1;}
}
//下边界(不含角)
for(int j=1;j<kuan-1;j++){
int huo=0;
if(board[chang-1][j-1]>0){huo++;}
if(board[chang-1][j+1]>0){huo++;}
if(board[chang-2][j+1]>0){huo++;}
if(board[chang-2][j-1]>0){huo++;}
if(board[chang-2][j]>0){huo++;}
if(board[chang-1][j]>0){
if(huo!=3&&huo!=2){board[chang-1][j]=2;}
}
else if(huo==3){board[chang-1][j]=-1;}
}
//左边界(不含角)
for(int i=1;i<chang-1;i++){
int huo=0;
if(board[i-1][0]>0){huo++;}
if(board[i+1][0]>0){huo++;}
if(board[i-1][1]>0){huo++;}
if(board[i][1]>0){huo++;}
if(board[i+1][1]>0){huo++;}
if(board[i][0]>0){
if(huo!=3&&huo!=2){board[i][0]=2;}
}
else if(huo==3){board[i][0]=-1;}
}
//右边界(不含角)
for(int i=1;i<chang-1;i++){
int huo=0;
if(board[i-1][kuan-1]>0){huo++;}
if(board[i+1][kuan-1]>0){huo++;}
if(board[i-1][kuan-2]>0){huo++;}
if(board[i][kuan-2]>0){huo++;}
if(board[i+1][kuan-2]>0){huo++;}
if(board[i][kuan-1]>0){
if(huo!=3&&huo!=2){board[i][kuan-1]=2;}
}
else if(huo==3){board[i][kuan-1]=-1;}
}
//左上角
int huo=0;
if(board[0][1]>0){huo++;}
if(board[1][0]>0){huo++;}
if(board[1][1]>0){huo++;}
if(board[0][0]>0){
if(huo!=3&&huo!=2){board[0][0]=2;}
}
else if(huo==3){board[0][0]=-1;}
//右上角
huo=0;
if(board[0][kuan-2]>0){huo++;}
if(board[1][kuan-1]>0){huo++;}
if(board[1][kuan-2]>0){huo++;}
if(board[0][kuan-1]>0){
if(huo!=3&&huo!=2){board[0][kuan-1]=2;}
}
else if(huo==3){board[0][kuan-1]=-1;}
//左下角
huo=0;
if(board[chang-2][0]>0){huo++;}
if(board[chang-1][1]>0){huo++;}
if(board[chang-2][1]>0){huo++;}
if(board[chang-1][0]>0){
if(huo!=3&&huo!=2){board[chang-1][0]=2;}
}
else if(huo==3){board[chang-1][0]=-1;}
//右下角
huo=0;
if(board[chang-2][kuan-1]>0){huo++;}
if(board[chang-1][kuan-2]>0){huo++;}
if(board[chang-2][kuan-2]>0){huo++;}
if(board[chang-1][kuan-1]>0){
if(huo!=3&&huo!=2){board[chang-1][kuan-1]=2;}
}
else if(huo==3){board[chang-1][kuan-1]=-1;}
//下面开始还原成1和0也就是-1->1,2->0(现在的状态是1活,0死,-1死->活,2活->死)
for(int i=0;i<chang;i++){
for(int j=0;j<kuan;j++){
if(board[i][j]==-1){board[i][j]=1;}
else if(board[i][j]==2){board[i][j]=0;}
}
}
}
}
}
}
//board[i][j]