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