Created
October 23, 2016 02:47
-
-
Save kumar-abhishek/fed5a02add8ed8fcc7ac6de86a1ab762 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 the 2nd bit will 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment