/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#define size_x 10
#define size_y 10
typedef void * ptr_t;
typedef ptr_t (*field_t)[size_x][size_y];
typedef ptr_t (*state_f)(ptr_t state, field_t field, int x, int y);
#define min(A,B) ((A) < (B)?(A):(B))
#define max(A,B) ((A) > (B)?(A):(B))
ptr_t state_dead(ptr_t current_state, field_t field, int x, int y);
ptr_t state_alive(ptr_t current_state, field_t field, int x, int y)
{
int x_min = max(x-1, 0);
int x_max = min(x+1, size_x-1);
int y_min = max(y-1, 0);
int y_max = min(y+1, size_y-1);
int alive_count = 0;
for (int i = x_min; i <= x_max; i++)
{
for (int j = y_min; j <= y_max; j++)
{
if ((*field)[i][j] == (void*)(state_alive)) alive_count++;
}
}
alive_count -= 1;
if ((alive_count == 2) || (alive_count == 3))
return (ptr_t)(state_alive);
else
return (ptr_t)(state_dead);
}
ptr_t state_dead(ptr_t current_state, field_t field, int x, int y)
{
int x_min = max(x-1, 0);
int x_max = min(x+1, size_x-1);
int y_min = max(y-1, 0);
int y_max = min(y+1, size_y-1);
int alive_count = 0;
for (int i = x_min; i <= x_max; i++)
{
for (int j = y_min; j <= y_max; j++)
{
if ((*field)[i][j] == (void*)(state_alive)) alive_count++;
}
}
if (alive_count == 3)
return (ptr_t)(state_alive);
else
return (ptr_t)(state_dead);
}
void print_field(field_t field)
{
for (int i = 0; i < size_x; i++)
{
for (int j = 0; j < size_y; j++)
{
if ((*field)[i][j] == (ptr_t)(state_alive)) printf("1 ");
else printf("0 ");
}
printf("\n");
}
}
int main()
{
ptr_t field1[size_x][size_y];
ptr_t field2[size_x][size_y];
int i, j;
for (i = 0; i < size_x; i++)
{
for (j = 0; j < size_y; j++)
{
field1[i][j] = (ptr_t)(state_dead);
field2[i][j] = (ptr_t)(state_dead);
}
}
field1[0][2] = (ptr_t)(state_alive);
field1[1][2] = (ptr_t)(state_alive);
field1[2][2] = (ptr_t)(state_alive);
field1[2][1] = (ptr_t)(state_alive);
field1[1][0] = (ptr_t)(state_alive);
printf("Initial distribution:\n");
print_field(&field1);
for (int n=0; n<30; n++)
{
for (int i = 0; i < size_x; i++)
{
for (int j = 0; j < size_y; j++)
{
state_f f = ((state_f)(field1[i][j]));
field2[i][j] = (ptr_t)( f(&field1[i][j], &field1, i, j) );
}
}
printf("Distribution after step %d:\n", n);
print_field(&field2);
printf("\n");
memcpy(&field1, &field2, sizeof(field2));
}
return 0;
}