#include <stdlib.h>
#include <string.h>
/*WYSTEPUJE W CI.C <!------------------------------------------------------------------------------------------------------------------------------ */
 #include <stdio.h>
 #define MAXSTAN 3
 unsigned long int nazwa=0;
 /*sprawdza czy 1 - kolko wygralo, jesli tak zwraca wartosc ujemna, jesli wygralo 2 zwraca wartosc dodatnia*/
 short int sprawdzczywygral(short int tab[MAXSTAN][MAXSTAN])
 { 
  int i,j;
  for(i=0; i<(MAXSTAN); i++)
   for(j=1; j<(MAXSTAN); j++)
   { 
    /*Sprawdzenie po wierszach i kolumnach, czy ktos wygral*/
    if((tab[i][0]==j)&&(tab[i][1]==j)&&(tab[i][2]==j)) goto wygrana;
    if((tab[0][i]==j)&&(tab[1][i]==j)&&(tab[2][i]==j)) goto wygrana;
   } 
  /*Sprawdzenie po przekatnych, czy ktos wygral*/
  if((tab[0][0]==j)&&(tab[1][1]==j)&&(tab[2][2]==j)) goto wygrana;
  if((tab[2][0]==j)&&(tab[1][1]==j)&&(tab[0][2]==j)) goto wygrana;
  return 0; /*Jesli nikt nie wygral zwroc 0*/
  wygrana: return (j==1)?-1:1;
 }

 short int sprawdzczyremis(short int tab[MAXSTAN][MAXSTAN])
 {
  int i=0; int j=0;
  while(j<(MAXSTAN+1)) /*jeśli licznik, wyszedł poza największą liczbę kolumn+1 pętla ma się przerwać ponieważ, została już sprawdzona cała tablica*/
  {
   if(tab[i][j]==0) return 1; /*if sprawdza czy komorka jest rowna 0, jesli tak, oznacza, ze jest wolne miejsce w tablicy na znak i jest zwracane 1*/
   ++i;
   if(i==(MAXSTAN+1)) {i=0; ++j;} /*jeśli licznik wyszedł poza największą liczbę wierszy+1, licznik ma się wyzerować i dodać do liczby kolumn*/
  }
  /*funkcja zwróci 0, wyłącznie wtedy kiedy w tablicy już nie ma wartości zero. Czyli miejsca gdzie można postawić figurę lub liczbę*/
  return 0;
 }

/*KONIEC------------------------------------------------------------------------------------------------------------------------------------------!>*/

short int rekurencja(char znak[11],short int ktogra)
{
 short int i,j,k,l,suma,licznik,stan[MAXSTAN][MAXSTAN],wygral,remis; char znak1[11]; int wyniki[MAXSTAN*MAXSTAN];
 j=licznik=suma=0;
 for(i=(MAXSTAN-1); i>-1; i--) 
 for(j=0; j<MAXSTAN; j++)
 {
  znak[licznik]=='0'?stan[i][j]=0:(znak[licznik]=='1'?stan[i][j]=1:(stan[i][j]=2)); 
  ++licznik;
 } 
 wygral=sprawdzczywygral(stan); if(wygral!=0) return wygral;
 remis=sprawdzczyremis(stan); if(remis!=1) return remis; 
 j=-1; k=1; l=-1;  /*32000 -32000 -1*/
 for(i=0; i<(MAXSTAN*MAXSTAN); i++) 
 {
  if(znak[i]=='0')
  {
   strcpy(znak1,znak);
   ktogra==1?znak1[i]='1':(znak1[i]='2');
   wyniki[i]=rekurencja(znak1,ktogra==1?2:1);
   if(ktogra!=2)
   { if(k>wyniki[i]) { k=wyniki[i]; l=i; } }
   else
   if(j<wyniki[i]) { j=wyniki[i]; l=i; } 
  }
  else wyniki[i]=0;   
 }
 
 //printf("\n%6li %s \n",nazwa,znak);
 for(i=0; i<(MAXSTAN*MAXSTAN); i++)
 { 
  suma+=wyniki[i];
  printf("\nkrok %i suma %i dodaje %i\n",i,suma,wyniki[i]);
 }
 //printf("\n%i\n",suma);
printf("\n %6li %s %i suma %i",nazwa, znak, l,suma); 
 nazwa+=1;
 return suma;
}

  
 
 

int main()
{
 //112212121
 //100200121
 //110220121
 printf("\n%i\n",rekurencja("110220000",2));
 return 0;
}