По поводу самого алгоритма, тот сложного ничего нет.
Есть две битовые матрицы размером x,y.
В первой матрице находится расположение населения.
Во вторую мы заносим результат при вычислении а за тем копируем вторую в первую и выводим.
Алгоритм такой:
1. Обходим первую матрицу и проверяем, если эта точка мертва(пуста), то если рядом с ней есть 3 живых(заполненых) точки, то эта точка оживает.
Если же точка уже жива, то если рядом с ней находится иное значение чем 2 или 3 живых точек, то эта точка умирает. Результат заносится во вторую матрицу в такую же точку.
2. Копируем 2 матрицу в первую.
Либо
2. Делаем 2 матрицу активной, а 1 результатирующей(буферной).
#define Xm 10 //Коричество клеток по X
#define Ym 10 //Коричество клеток по Y
char pole[Xm][Ym][2], activ=0;
void raschot()
{
int kol,Dx,Dy; //Количество живых поблизости клеток, кореектирующие переменные
for(int y=0;y<Ym;y++)
for(int x=0;x<Ym;x++)
{
kol=0; Dx=0; Dy=0;
if (x==0) Dx=Xm; //Если проверка у левого края
if (x==Xm-1) Dx=-Xm; //Если проверка у правого края
if (y==0) Dy=Ym; //Если проверка у левого края
if (y==Ym) Dy=-Ym; //Если проверка у левого края
if (pole[Xm+x-1][y][activ]) kol++; //Слева
if (pole[Xm+x+1][y][activ]) kol++; //Справа
if (pole[x][Ym+y-1][activ]) kol++; //Сверху
if (pole[x][Ym+y+1][activ]) kol++; //Снизу
if (pole[Xm+x-1][Ym+y-1][activ]) kol++; //Слева-сверху
if (pole[Xm+x-1][Ym+y+1][activ]) kol++; //Слева-снизу
if (pole[Xm+x+1][Ym+y-1][activ]) kol++; //Справа-сверху
if (pole[Xm+x+1][Ym+y+1][activ]) kol++; //Справа-снизу
//Судим клетку
if (pole[x][y][activ]) //Если клетка жива
{
if (kol==2||kol==3) pole[x][y][1-activ]=1; else //Милуем её
pole[x][y][1-activ]=0; //Убиваем
} else
{ //Если клетка мертва
if (kol==3) pole[x][y][1-activ]=1; else //Оживляем
pole[x][y][1-activ]=0; //Оставляем мёртвой
}
}
activ=1-activ; //Меняем активную матрицу на противоположную.
}
Вот, эта функция будет вычислять поколения. Поле при этом замкнутое. Активная матрица указана в переменой activ.