Backtracking problema turnului

Se dau n cuburi numerotate 1,2,...,n, de laturi li si culori ci, i=1,2,...,n (fiecare culoare este codificata printr-un caracter).

Sa se tipareasca toate turnurile care se pot forma luand p cuburi din cele n disponibile, astfel incat laturile cuburilor din turn sa fie in ordine crescatoare iar culorile a oricare 2 cuburi alaturate din turn sa fie diferite, apoi sa se afiseze turnul de inaltime maxima(inaltimea unui turn este data de suma inaltimilor cuburilor componente).

Exemplu: n=4,p=3, consideram cuburile 1,2,3,4 de laturi (8,4,9,6) si culori ('r','v','g','v'). Turnurile de cate 3 cuburi care indeplinesc cerintele din enunt sunt [2,1,3], [4,1,3], iar cel de inaltime maxima este [4,1,3].

 

#include

int st[10],li[10],k,i,n,p,mh=0,max[10];

char ci[10];

int valid(int k)

{for(i=1;i

if((st[i]==st[k])||(li[st[k]]

return 0;

if(ci[st[k]]==ci[st[k-1]])

return 0;

return 1;}

int solutie(int k)

{return(p==k);}

void afis()

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

cout<

void bkt(int k)

{int val,s=0;

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

{st[k]=val;

if(valid(k))

if(solutie(k))

{afis();

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

s=s+li[st[i]];

if(s>mh)

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

max[i]=st[i];}

else bkt(k+1);}}

void main()

{cin>>n;cin>>p;

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

{cout<<"Inaltimea cubului "<

cout<<"Culoarea cubului "<

bkt(1);

cout<<"Turnul de inaltime maxima este ";

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

cout<