witam
jas i malgosia ciagna karty z talii n kart
moga wyciagnac tylko 1, 2 lub 4 karty w jednej turze
ciagna na zmiane
gra sie skonczy gdy zabraknie kart
oboje graja bezblednie. jas zawsze zaczyna
na wejsciu jest podawana ilosc kart
na wyjsciu jest podawany zwyciesca
nie wiem jak to zrobic
probowalem za pomoca algorytmu minmax ale nie wiem jak zrobic drzewa gdzie sa wiecej niz 2 galezie
mozna prosic o jakies wskazowki ?
znalazlem cos i sprobowalem za pomoca rekurencji ale dalej nie dziala jak powinno
state[0] = 1;
state[1] = 2;
state[2] = 4;
typedef long long Handle;
vector<Handle> tab(n);
bool przegrana (vector<Handle> &tab) // jesli ten gracz nie ma ruchu to przegrywa
{
Handle j = (Handle)tab.size();
for(int i = 1; i <=j; i++)
if (tab[i] > 1) return false;
return true;
}
Handle minimax(vector<Handle> &tab , int gracz)
{
if ( przegrana (tab) ) return ( gracz == 1 ) ? 1 : -1;
int m , mmx,i;
m = 0;
Handle j = (Handle)tab.size();
Handle maxvalue = tab[j];
gracz = gracz ? 0: 1; // zmieniamy graczy aby analizowac ruch rzeciwnika
mmx = gracz ? -maxvalue : maxvalue ;
for (i = 0; i<3; i++)
{
if (tab[j] > 1)
{
tab[j]-=state[i];
m = minimax (tab,gracz);
tab[j]+=state[i];
}
if(((gracz == 0) && (m < mmx)) || ((gracz == 1) && (m > mmx))) mmx = m;
}
//cout<< m << " " << mmx << " " <<tab[j]<<" "<<gracz<<endl;
return mmx;
}
int graj (vector<Handle> &tab, int &gracz)
{
Handle ruch, i, m, mmx;
Handle j = (Handle)tab.size();
Handle maxvalue = tab[j];
bool p = false;
int last_array=j;
mmx = gracz ? -maxvalue : maxvalue ; // gracz pierwszy to MIN i minimalizuje
for ( i = 0; i<3; i++) // dla 1 , 2, 4
{
j = (Handle)tab.size();
tab[j]-=state[i];
m = minimax (tab,gracz);
tab[j]+=state[i];
if(m > mmx)
{
mmx = m; ruch = i;
/**/
}
}
}
tab[j]-=state[ruch];
if ( stick < state[ruch] )
if (whichs > j)
{
whichs = j;
stick = state[ruch];
}
if(tab[j] <= 1 ) tab.pop_back();
gracz = gracz ? 0 : 1; // zmieniamy graczy
}
Pozdrawiam