1
+ /*
2
+ 289. Game of Life
3
+
4
+ Submitted: April 3, 2025
5
+
6
+ Runtime: 0 ms (beats 100.00%)
7
+ Memory: 9.25 MB (beats 6.02%)
8
+ */
9
+
10
+ typedef struct pair {
11
+ int x ;
12
+ int y ;
13
+ } pair ;
14
+
15
+ inline unsigned char * * init2D (pair size ) {
16
+ int n = size .x , m = size .y ;
17
+ unsigned char * * mat = malloc ((sizeof (unsigned char * ) * n ) + (sizeof (unsigned char ) * n * m ));
18
+ unsigned char * data = (unsigned char * )(mat + n );
19
+ for (size_t i = 0 ; i < n ; ++ i ) {
20
+ mat [i ] = data + (m * i );
21
+ }
22
+ return mat ;
23
+ }
24
+
25
+ inline unsigned char * * copy2D (int * * matrix , pair size ) {
26
+ unsigned char * * copy = init2D (size );
27
+ int n = size .x , m = size .y ;
28
+ for (size_t i = 0 ; i < n ; ++ i ) {
29
+ for (size_t j = 0 ; j < m ; ++ j ) {
30
+ copy [i ][j ] = matrix [i ][j ];
31
+ }
32
+ }
33
+ return copy ;
34
+ }
35
+
36
+ #define isValidIndex (n , m , i , j ) ((0 <= i && i < n) && (0 <= j && j < m))
37
+ #define validOrZero (a , n , m , i , j ) (isValidIndex(n, m, i, j) ? a[i][j] : 0)
38
+ unsigned char sumOfNeighbors (unsigned char * * matrix , pair size , pair index ) {
39
+ const int n = size .x , m = size .y ;
40
+ const int i = index .x , j = index .y ;
41
+ return validOrZero (matrix , n , m , i - 1 , j - 1 ) +
42
+ validOrZero (matrix , n , m , i - 1 , j ) +
43
+ validOrZero (matrix , n , m , i - 1 , j + 1 ) +
44
+ validOrZero (matrix , n , m , i , j - 1 ) +
45
+ validOrZero (matrix , n , m , i , j + 1 ) +
46
+ validOrZero (matrix , n , m , i + 1 , j - 1 ) +
47
+ validOrZero (matrix , n , m , i + 1 , j ) +
48
+ validOrZero (matrix , n , m , i + 1 , j + 1 );
49
+ }
50
+
51
+ void gameOfLife (int * * board , int boardSize , int * boardColSize ) {
52
+ pair size = { boardSize , boardColSize [0 ] };
53
+ int n = size .x , m = size .y ;
54
+ unsigned char * * copy = copy2D (board , size );
55
+ for (size_t i = 0 ; i < n ; ++ i ) {
56
+ for (size_t j = 0 ; j < m ; ++ j ) {
57
+ int cell = board [i ][j ];
58
+ pair index = { i , j };
59
+ unsigned char neighbors = sumOfNeighbors (copy , size , index );
60
+ if (cell ) {
61
+ if (neighbors < 2 ) {
62
+ board [i ][j ] = 0 ;
63
+ } else if (neighbors > 3 ) {
64
+ board [i ][j ] = 0 ;
65
+ }
66
+ } else {
67
+ if (neighbors == 3 ) {
68
+ board [i ][j ] = 1 ;
69
+ }
70
+ }
71
+ }
72
+ }
73
+ free (copy );
74
+ }
0 commit comments