Dado un tablero con m por n celdas, cada celda tiene un estado inicial vivo (1) o muerto (0). Cada celda interactúa con sus ocho vecinos (horizontal, vertical, diagonal) utilizando las siguientes cuatro reglas:
Cualquier célula viva con menos de dos vecinos vivos muere, como si fuera causada por una población insuficiente.
Cualquier célula viva con dos o tres vecinos vivos vive para la próxima generación.
Cualquier célula viva con más de tres vecinos vivos muere, como por sobrepoblación.
Cualquier célula muerta con exactamente tres vecinos vivos se convierte en una célula viva, como por reproducción.
Escriba una función para calcular el siguiente estado (después de una actualización) de la placa dado su estado actual.
Solución Java 1
Debido a que necesitamos resolver el problema en su lugar, podemos usar el bit más alto para registrar el siguiente estado. Y al final, cambie un poco a la derecha para obtener el siguiente estado para cada celda.
public void gameOfLife(int[][] board) { if(board==null || board.length==0||board[0].length==0) return; int m=board.length; int n=board[0].length; int[] x = {-1, -1, 0, 1, 1, 1, 0, -1}; int[] y = {0, 1, 1, 1, 0, -1, -1, -1}; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ int count=0; for(int k=0; k<8; k++){ int nx=i+x[k]; int ny=j+y[k]; if(nx>=0&&nx<m&&ny>=0&&ny<n&&(board[nx][ny]&1)==1){ count++; } } //<2 die if(count<2){ board[i][j] &= 1; } //same state if(count==2||count==3){ board[i][j] |= board[i][j]<<1; } //go live if(count==3){ board[i][j] |=2; } //>3 die if(count>3){ board[i][j] &=1; } } } for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ board[i][j] = board[i][j]>>1; } } } |