#include "stdafx.h"
#include "gwz2.h"
#include "gwz2Dlg.h"
#include "Gra.h"
#include <omp.h>

void kolejnePokolenie(char * biezace, char *nastepne, int rozmiar, int LiczbaWatkow)
{
   //task_scheduler_init init;
   //int ileWatkow = task_scheduler_init::default_num_threads();
	

	//LPTSTR    psText = _T("Static Text");
	#pragma omp parallel num_threads(LiczbaWatkow) default(none) shared(biezace, rozmiar, nastepne)  
	{
		#pragma omp for
		for (int i = 0; i < rozmiar * rozmiar; ++i)
			nastepne[i] = komorka(i, biezace, rozmiar);
	}
   }

char komorka(int k, char *const biezace, int const rozmiar)
{
   int i = k / rozmiar,
      j = k % rozmiar,
      suma = 0, 
      im1 = (i == 0) ? rozmiar - 1 : i - 1,
      ip1 = (i == rozmiar - 1) ? 0 : i + 1,
      jm1 = (j == 0) ? rozmiar - 1 : j - 1,
      jp1 = (j == rozmiar - 1) ? 0 : j + 1;

	   if (biezace[im1 * rozmiar + jm1]) ++suma;	// i-1, j-1
	   if (biezace[im1 * rozmiar + j]) ++suma;	// i-1, j
	   if (biezace[im1 * rozmiar + jp1]) ++suma;	// i-1, j+1
	   if (biezace[i * rozmiar + jm1]) ++suma;	// i, j-1
	   if (biezace[i * rozmiar + jp1]) ++suma;	// i, j+1
	   if (biezace[ip1 * rozmiar + jm1]) ++suma;	// i+1, j-1
	   if (biezace[ip1 * rozmiar + j]) ++suma;	// i+1, j
	   if (biezace[ip1 * rozmiar + jp1]) ++suma;	// i+1, j+1

   if (biezace[i * rozmiar + j] == 0 && suma == 3)
      return 1;
   else if (biezace[i * rozmiar + j] == 1 && (suma == 2 || suma == 3))
      return 1;
   return 0;
}

void WartosciPoczatkowe(char* biezace, int rozmiar)
{
	int ix, iy;
	for (int i=0;i<rozmiar*rozmiar;i++)
	{
		ix = i/rozmiar;
		iy = i % rozmiar;
		if (ix==(iy-1) || ix==(iy) || ix==(iy+1) || (ix==rozmiar/2))
			biezace[i]=1;
		else
			biezace[i]=0;
	}
}