Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit a6c6ac4

Browse files
author
Tushar Roy
committed
Update game of life
1 parent 534f5ca commit a6c6ac4

File tree

1 file changed

+63
-119
lines changed

1 file changed

+63
-119
lines changed
Lines changed: 63 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,126 +1,70 @@
11
package com.interview.multiarray;
22

3+
/**
4+
* Date 10/20/2016
5+
* @author Tushar Roy
6+
* Given a board with m by n cells, each cell has an initial state live (1) or dead (0).
7+
* Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following
8+
* four rules (taken from the above Wikipedia article):
9+
* Read full qs on leetcode.
10+
*
11+
* Solution - Keep two array prev and current. Fill the values in current array. As soon as current row is done
12+
* replace elemments of board with prev array.
13+
*
14+
* Time complexity O(n * m)
15+
*
16+
* https://leetcode.com/problems/game-of-life/
17+
*/
318
public class GameOfLife {
19+
public void gameOfLife(int[][] board) {
20+
if (board.length == 0 || board[0].length == 0) {
21+
return;
22+
}
23+
int n = board.length;
24+
int m = board[0].length;
25+
int[] prevRow = new int[m];
26+
int[] currentRow = new int[m];
427

5-
boolean [][]board = null;
6-
boolean [][]tempBoard = null;
7-
public GameOfLife(boolean[][] initialState){
8-
board = initialState;
9-
tempBoard = new boolean[board.length][board.length];
10-
}
11-
12-
public void printState(){
13-
for(int i=0; i < board.length; i++){
14-
for(int j=0; j < board[i].length; j++){
15-
if(board[i][j]){
16-
System.out.print("1 ");
17-
}else{
18-
System.out.print("0 ");
19-
}
20-
}
21-
System.out.print("\n");
22-
}
23-
System.out.print("\n\n");
24-
}
25-
26-
public void next(){
27-
28-
int count=0;
29-
for(int i=0; i < board.length; i++){
30-
for(int j=0; j < board[i].length; j++){
31-
count = countNeighbors(i, j);
32-
tempBoard[i][j] = board[i][j];
33-
if(count <= 1){
34-
tempBoard[i][j] = false;
35-
}
36-
if(count ==3){
37-
tempBoard[i][j] = true;
38-
}
39-
if(count >= 4){
40-
tempBoard[i][j] = false;
41-
}
42-
}
43-
}
44-
boolean[][] rBoard = tempBoard;
45-
tempBoard = board;
46-
board = rBoard;
47-
}
28+
for (int i = 0; i < n; i++) {
29+
for (int j = 0; j < m; j++) {
30+
currentRow[j] = doesLive(i, j, board) ? 1 : 0;
31+
}
32+
if (i != 0) {
33+
copyRow(prevRow, board[i - 1]);
34+
}
35+
if (i != n - 1) {
36+
copyRow(currentRow, prevRow);
37+
}
38+
}
39+
copyRow(currentRow, board[n - 1]);
40+
}
4841

49-
public void nextOptimized(){
50-
51-
boolean temp1[] = new boolean[board[0].length];
52-
boolean temp2[] = new boolean[board[0].length];
53-
calculate(board,temp1,0);
54-
for(int i=1; i < board.length; i++){
55-
calculate(board,temp2,i);
56-
copy(i-1,temp1);
57-
copy(temp1,temp2);
58-
}
59-
copy(board.length-1,temp1);
60-
}
61-
62-
void copy(boolean arr1[],boolean arr2[]){
63-
for(int i=0; i <arr2.length; i++){
64-
arr1[i] = arr2[i];
65-
}
66-
}
67-
68-
void calculate(boolean [][]board,boolean temp[],int i){
69-
int count=0;
70-
for(int j=0; j < board[i].length; j++){
71-
count = countNeighbors(i, j);
72-
temp[j] = board[i][j];
73-
if(count <= 1){
74-
temp[j] = false;
75-
}
76-
if(count ==3){
77-
temp[j] = true;
78-
}
79-
if(count >= 4){
80-
temp[j] = false;
81-
}
82-
}
42+
private void copyRow(int[] source, int[] dest) {
43+
for (int i = 0; i < source.length; i++) {
44+
dest[i] = source[i];
45+
}
46+
}
8347

84-
}
85-
86-
private void copy(int i,boolean []temp){
87-
for(int x=0; x < temp.length; x++){
88-
board[i][x] = temp[x];
89-
}
90-
}
91-
92-
private int countNeighbors(int i,int j){
93-
int count =0;
94-
for(int k = i-1; k <= i+1; k++){
95-
for(int l = j-1; l <= j+1; l++){
96-
if((i ==k && j == l) || k < 0 || l < 0 || k >= board.length || l >= board[k].length){
97-
continue;
98-
}
99-
if(board[k][l]){
100-
count++;
101-
}
102-
}
103-
}
104-
return count;
105-
}
106-
107-
public static void main(String args[]){
108-
boolean[][] initialState = new boolean[10][10];
109-
initialState[3][6] = true;
110-
initialState[4][6] = true;
111-
initialState[5][6] = true;
112-
initialState[5][7] = true;
113-
initialState[5][8] = true;
114-
GameOfLife gol = new GameOfLife(initialState);
115-
gol.printState();
116-
gol.nextOptimized();
117-
gol.printState();
118-
gol.nextOptimized();
119-
gol.printState();
120-
gol.nextOptimized();
121-
gol.printState();
122-
gol.nextOptimized();
123-
gol.printState();
124-
125-
}
48+
private boolean doesLive(int x, int y, int[][] board) {
49+
int count = 0;
50+
for (int i = x - 1; i <= x + 1; i++) {
51+
for (int j = y - 1; j <= y + 1; j++) {
52+
if (x == i && y == j) {
53+
continue;
54+
}
55+
if (i < 0 || i >= board.length) {
56+
break;
57+
}
58+
if (j < 0 || j >= board[0].length) {
59+
continue;
60+
}
61+
count += board[i][j];
62+
}
63+
}
64+
if (board[x][y] == 1) {
65+
return count == 2 || count == 3;
66+
} else {
67+
return count == 3;
68+
}
69+
}
12670
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /