Problema turnurilor de cuburi

Se dau n cuburi numerotate 1,2,...,n, de laturi l şi culori c, i=1,2,...,n (fiecare culoare este codificată printr-un caracter).

Să se tipărească toate turnurile care se pot forma luând k cuburi din cele n disponibile, astfel încat laturile cuburilor din turn să fie în ordine crescătoare iar culorile a oricare 2 cuburi alăturate din turn să fie diferite.

Exemplu: n=4,p=3, considerăm cuburile 1,2,3,4 de laturi (8,4,9,6) şi culori ('r','v','g','v'). Turnurile de cate 3 cuburi care îndeplinesc cerințele din enunț sunt [2,1,3], [4,1,3].

 

#include

int st20,l20,c20,i,n,k;

void initializare ()

{for(i=1;i<=25;i++)

st[i]=0;

cin>>n;

for(i=1;i<=n;i++)

{cin>>l[i];

cin>> c[i]; } }

void tiparire (int p)

{int i;

for(i=1;i<=p;i++)

cout<

int validare (int p)

{for(i=1;i<=p-1;i++)

if( l[st[p]]<=l[st[i]]) return 0;

if (p>1 && c[st[p]]==c[st[p-1]]) return 0;

return 1;}

void back (int p)

{int val;

for( val=1; val<=n; val++)

{st[p]=val;

if (validare(p))

if(p==k)

tiparire(p);

else back(p+1);}}

int main ()

{cin>>k;

initializare ();

back (1);

return 0; }