Sunteți pe pagina 1din 41

INFORMATIC / LABORATOR Clasa a XI-a

2014

BACKTRACKING. PROBLEME

ENUNURI PROBLEME FI DE LUCRU


Probleme lucrare practic
1. PERMUTRI. Se citete un numr natural N. S se genereze permutrile mulimi
{1, 2, , N};
2. ARANJAMENTE. Se citesc dou numere naturale N i P (P<=N). S se genereze
toate submulimile mulimii {1, 2, , N} de cte P elemente. Dou submulimi cu
aceleai elemente la care ordinea acestora difer sut considerate distincte.
Mulimea {1, 2, 3} este diferit de mulimea {1, 3, 2}
3. COMBINRI. Se citesc dou numere naturale N i P (P<=N). S se genereze
toate submulimile mulimii {1, 2, , N} de P elemente. Dou submulimi se
consider egale, dac i numai dac au aceleai elemente, indiferent de ordinea
n care acestea apar. Mulimea {1, 2, 3} NU este diferit de mulimea {1, 3, 2}
4. PERMUTRI GENERALE. Se citete N natural. Se citesc N numere ntregi
distincte. S se genereze permutrile mulimii formate din numerele citite.
5. PERMUTRI DE CUVINTE. Se citete N natural. Se citesc N cuvinte. S se
genereze permutrile mulimii formate din cuvintele citite.
6. DAME. Se citete N natural. S se aeze N dame pe o tabl de ah de
dimensiune N astfel nct oricare dou dintre cele N dame s nu se atace. Dou
dame se atac dac sunt pe aceeai linie sau pe aceeai coloan sau pe
aceeai diagonal.
7. PRODUS CARTEZIAN. Se citete N natural. S se genereze produsul cartezian
{1, 2, , N} X {1, 2, , N} X X{1, 2, , N} (de N ori).
8. PRODUS CARTEZIAN a N mulimi cu cte M elemente. Se citete N natural. Se
citesc N mulimi: A1, A2, , AN, fiecare coninnd cte M elemente (elementele
unei mulimi sunt distincte). S se genereze produsul cartezian A1 X A2 X AN.
9. PRODUS CARTEZIAN GENERAL. Se citete N natural. Se citesc N mulimi: A1,
A2, , AN, coninnd k1, k2, kN elemente (elementele unei mulimi sunt
distincte). S se genereze produsul cartezian A1 X A2 X AN.
10. IR DE 0 SI 1. S se genereze toate irurile de numere de lungime N formate
doar din elemente 0 i 1.
11. DRAPELE TRICOLORE. Avem la dispoziie 6 culori: alb, galben, rou, verde,
albastru, negru. S se precizez toate drapelele tricolore care se pot proiecta, tind
c trebuie respectate urmtoarele reguli: (Regula 1:) orice drapel are culoarea din
mijloc galben sau verde, (Regula 2: ) cele trei culori de pe drapel sunt distincte.
12. PARANTEZE. Se d un numr natural N par. S se determine toate irurile de N
paranteze care se nchid corect. Exemplu: N =6 ((( ))), (( )( )), ( )( )( ), ( )(( )),
(( ))( )
13. SUBMULIMILE UNUI MULIMI. Se consider o mulime A cu N elememte
ntregi. S se genereze toate submulimile acestei mulimi. Mulimea vid este
submulime a oricrei mulimi. Orice mulime A este considerat submulime a
mulimii A.
14. PARTIIILE UNEI MULIMI. Se consider mulimea A= {1, 2, , N}. Se cer toate
partiiile acestei mulimi. Submulimile A1, A2, , Ak constituie o partiie a mulimii
A dac sunt disjuncte ntre ele i reuniunea lor este mulimea A. Exemplu: o
partiie a mulimii {1, 2, 3} este {1, 2} U {3}.

INFORMATIC / LABORATOR Clasa a XI-a

2014

15. PROBLEMA COLORRII HARILOR. Find dat o hart cu N ri, se cer toate
soluiile de colorare a hrii utiliznd maxim 4 culori, astfel nct oricare dintre
dou ri cu frontier comun s fie colorate cu culori diferite.
16. PROBLEMA COMIS-VOIAJORULUI. Un comis-voiajor trebuie s viziteze un
numr de N orae. Iniial acesta se afl ntr-unul din ele notat 1. Comis-voiajorul
dorete s nu treac de dou ori prin acelai ora iar la ntoarcere s revin n
oraul 1. Cunoscnd legturile dintre orae, se cere s se tipreasc toate
drumurile poibile pe care le poate efectua comis-voiajorul.
17. PROBLEMA PLII unei sume S utiliznd N tipuri de monede. Se dau: suma S i
N tipuri de monede avnd valorile: a1, a2, .., an lei. Se cer toate modalitile de
plat exact a sumei S utiliznd aceste monede.
18. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s
se tipreasc toate modurile de descompunere a sa ca sum de numere naturale
(Exemplu: pentru numrul 4: 1111, 112, 121, 13, 211, ).
19. DESCOMPUNERE. S se decompun un numr natural N n toate modurile
posibile ca sum de p numere naturale distincte. (p<=N).
20. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural
N, se cere s se afieze toate descompunerile numrului respectiv ca sum de
numere prime.
21. DELEGAII. Dintr-un grup de N persoane, dintre care p femei, trebuie format o
delegaie de K persoane, din care L femei. S se precizeze toate delegaiile care
se pot forma.
22. ARANJAMENTE DE LITERE. Se citesc de la tastatur dou numere naturale N
i P. (0<N<P<12). S se afieze toate irurile de P litere distincte, litere alese
dintre primele N litere mari ale alfabetului englez. De exemplu pentru N=4 i P=2:
AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC.
23. DESCOMPUNERE N NUMERE CONSECUTIVE. Se d un numr natural N > 5 .
S se afieze toate descompunerile lui N ca sum de numere naturale
consecutive.
24. COTROCENI. La palatul COTROCENI se ine o conferin de pres la care
trebue s ia cuvntul 5 purttori de cuvnt numii A, B, C, D, E. Afiai toate
modurile de nscriere la cuvnt astfel nct persoana A s vorbeasc mai trziu
dect persoana D i persoana E s fie printre primele trei persoane care vorbesc.
25. SUBMULIMI DE SUMA S. S se genereze toate submulimile de cte M
elemente ale unei mulimi de N elemente pentru care suma elementelor s nu
depeasc o valoare maxim Smax.
26. EXAMEN. S se elaboreze toate modalitile de a promova un examen care
conine N probe, tiind c la fiecare prob (i) se poate obine un punctaj ntre 1 i
(P[i]) iar pentru a fi promovat, un candidat trebuie s obin mcar M puncte.
27. SIR FR NUMERE CONSECUTIVE. S se alctuiasc toate irurile posibile de
cte N (0<N<=9) numere naturale distincte alese din primele N numere naturale
fr 0 (1, 2, .., N) astfel nct s nu existe dou numere consecutive aezate
alturi. Dou numere x i y sunt considerate consecutive dac x = y + 1 sau y = x
+ 1.
28. MATRICE PATRATIC BINAR. SIMETRIC. S se genereze toate matricile
ptratice de dimensiune N, formate doar cu elemente 0 i 1, simetrice fa de
diagonala principal i cu diagonala principal 0.

INFORMATIC / LABORATOR Clasa a XI-a

2014

29. MATRICE BINARA CU maxim UN 1 pe fiecare COLOANA I pe fiecare LINIE.


S se genereze toate matricile ptratice de dimensiune N, formate doar cu
elemente 0 i 1 cu proprietatea c pe fiecare linie exist un singur 1 i pe fiecare
coloan apare o singur dat cifra 1.
30. TEZE. O clas de elevi trebuie s programeze M teze n N zile. Determinai toate
posibilitile de programare a tezelor tiind c nu se pot susine dou teze n
aceeai zi.
31. MELODII. S se genereze toate posibilitile de a aranjare pe o caset a N
melodii, astfel nct melodia x s se cnte dup melodia y.
32. CUBURI. Se consider N cuburi numerotate de la 1 la N, de laturi i culori diferite.
S se genereze toate turnurile posibile formate din M cuburi astfel nct turnurile
s aib stabilitate (nu aezm un cub mai mare peste un cub mai mic) i s nu
existe dou cuburi de aceeai culoare consecutive.
33. NUMERE BINE ORDONATE. S se genereze toate numerele bine ordonate
descresctor formate din 3 cifre. Un numr este bine ordonat descresctor dac
are toate cifrele distincte i n ordine strict descresctoare.
34. Se citete un numr natural N i un numr natural V, (V<N). S se afieze toate
modurile n care pot fi aranjate numerele de la 1 la N astfel nct diferena n
modul dintre dou numere alturate s fie mai mic sau egal dect V.
35. Se d un cuvnt de lungime N, format din caractere distincte. S se afieze toate
cuvintele de lungime N care se pot forma cu caracterele cuvntului dat i care
ndeplinesc condiia c nu exist dou consoane sau dou vocale alturate. (n
cadrul cuvintelor generate caracterele nu se repet).
36. Fie A = {2, 5, 6, 7, 8}. Afiai toate numerele care se pot forma cu aceste cifre,
astfel nct s nu existe dou cifre pare sau dou cifre impare alturate.
Numerele vor conine exact 5 cifre si cifrele care formeaza numarul vor fi
distincte.
37. S se genereze N vectori de lungime P cu elemente 1 i 2 cu proprietatea c
suma elementelor este egal cu un S dat.
38. Se consider N obiecte avnd greutile g1, g2, , gN. S se afieze toate
posibilitile de a echilibra o balan ce are pe braul din stnga un obiect de
greutate G. Determinai soluia la care echilibrarea se face cu numr minim de
greuti.
39. S se elaboreze toate variantele de chestionare care se pot obine dintr-un set de
N ntrebri care s aib ntre a i b ntrebri, iar la fiecare chestionar trebuie s se
totalizeze ntre p i q puncte. Se cunoate punctajul fiecrei ntrebri.
40. S se genereze toate submulimile de cte M elemente a unei mulimi de N
numere naturale pentru care suma elementelor s se ncadreze n intervalul
[a,b].
41. Un grup de N turiti au la dispoziie P corturi de capaciti k1, k2, ..kp. S se
determine toate posibilitile de a caza cei N turiti astfel nct s nu rmn nici
un cort gol i nici un turist afar. Dac nu exist nici o solutie se va afia mesajul
corespunztor.
42. Doi hoti au jefuit o banc i au furat N saci cu bani. Pe fiecare sac scrie ci bani
se afl n sacul respectiv. S se afieze toate posibilitile de a mpri sacii cu
bani astfel nct cei doi hoi s primeasc aceeai sum de bani. n cazul n care
suma total nu se poate mpri exact se va afia un mesaj corespunztor.

INFORMATIC / LABORATOR Clasa a XI-a

2014

43. Daca se utilizeaza metoda Backtracking pentru a genera in ordine strict crescatoare toate numerele
naturale formate din 4 cifre pare distincte, care dintre numerele de mai jos trebuie eliminate astfel
incat cele ramase sa reprezinte o succesiune de numere corect generata?
1) 2068 2) 2084 3) 2088 4) 2468 5) 2086 6) 2406
44. Se utilizeaza metoda Bachtracking pentru a genera in ordine crescatoare toate numerele naturale
de 5 cifre distincte care se pot forma cu cifrele 0, 1, 2, 3 si 4. Sa se precizeze numarul generat
imediat inaintea si numarul generat imediat dupa secventa urmatoare: 12034, 12043, 12304,
12340.

45. S se genereze toate irurile de n (n<=6) note muzicale din mulimea {do, re, mi, fa, sol,
la, si}. Fiecare ir va fi afiat pe cte o linie n fiierul out.txt, notele n cadrul liniei fiind
separate prin cte un spaiu. Acestea se pot repeta n cadrul unui ir.
46. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s
se tipreasc toate modurile de descompunere a sa ca sum de numere naturale
(Exemplu: pentru numrul 4: 1111, 112, 121, 13, 211, ).
47. DESCOMPUNERE. S se decompun un numr natural N n toate modurile
posibile ca sum de p numere naturale distincte. (p<=N).
48. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural
N, se cere s se afieze toate descompunerile numrului respectiv ca sum de
numere prime.
49. S se genereze N vectori de lungime P cu elemente 1 i 2 cu proprietatea c suma
elementelor este egal cu un S dat.

INFORMATIC / LABORATOR Clasa a XI-a

2014

1. PERMUTRI. Se citete un numr natural N. S se genereze permutrile mulimi {1, 2, , N};


int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Permutari_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Permutari_Back ();
}
2. ARANJAMANTE. Se citesc dou numere naturale N i P (P<=N). S se genereze toate submulimile
mulimii {1, 2, , N} de P elemente. Dou submulimi cu aceleai elemente la care ordinea acestora difer
sut considerate distincte.
int N, P, V[10];
int Solutie (int k)
{
return (k==P);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Aranjamente_Back ()
{
for (int k=1; k<=N; k++)

INFORMATIC / LABORATOR Clasa a XI-a

2014

V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
cout << "P="; cin >> P;
Aranjamente_Back ();
}
3. COMBINRI. Se citesc dou numere naturale N i P (P<=N). S se genereze toate submulimile mulimii
{1, 2, , N} de P elemente. Dou submulimi se consider egale, dac i numai dac au aceleai
elemente, indiferent de ordinea n care acestea apar.
int N, P, V[10];
int Solutie (int k)
{
return (k==P);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (V[k-1]>V[k])
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Combinari_Back ()
{
for (int k=0; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
cout << "P="; cin >> P;

INFORMATIC / LABORATOR Clasa a XI-a

2014

Combinari_Back ();
}
4. PERMUTARI GENERALE. Se citete N natural. Se citesc N numere ntregi. S se genereze permutrile
mulimii formate din numerele citite.
int N, V[10], T[10];
void Citeste ()
{
for (int i=1; i<=N; i++)
{
cout << "numarul " << i << " ";
cin >> T[i];
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout<< setw(4) << T[V[j]]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Permutari_generale ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Citeste();
Permutari_generale ();
}
5. PERMUTRI DE CUVINTE. Se citete N natural. Se citesc N cuvinte. S se genereze permutrile
mulimii formate din cuvintele citite.
typedef char cuvant[20];
int N, V[10];
cuvant T[10];
void Citeste ()
{
for (int i=1; i<=N; i++)
{
cout << "cuvantul " << i << " ";
cin >> T[i];
}
}

INFORMATIC / LABORATOR Clasa a XI-a

2014

int Solutie (int k)


{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout<< setw(4) << T[V[j]]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Permutari_cuvinte ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Citeste();
Permutari_cuvinte ();
}
6. DAME. Se citete N natural. S se aeze N dame pe o tabl de ah de dimensiune N astfel nct oricare
dou dintre cele N dame s nu se atace. Dou dame se atac dac sunt pe aceeai linie sau pe aceeai
coloan sau pe aceeai diagonal
int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
for (i=1; i<=k-1; i++)
if ( abs(k-i)==abs(V[i]-V[k]) )
return 0;
return 1;
}
void Dame_Back ()

INFORMATIC / LABORATOR Clasa a XI-a

2014

{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Dame_Back ();
}
7. PRODUS CARTEZIAN. Se citete N natural. S se genereze produsul cartezian {1, 2, , N} X {1, 2, ,
N} X {1, 2, , N}.
int A[100],n;
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
cout<<endl;
for(int i=1;i<=k;i++)
cout<<A[i]<<" ";
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]<n)
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
cout<<"n="; cin>>n;
back();
}
8. PRODUS CARTEZIAN a N mulimi cu cte M elemente. Se citete N natural. Se citesc N mulimi: A1, A2,
, AN, fiecare coninnd cte M elemente (elementele unei mulimi sunt distincte). S se genereze
produsul cartezian A1 X A2 X AN.
int A[100],V[10][10],n, m;
void citire()
{
int i,j;
fstream F("b08.txt",ios::in);
F>>n>>m;

INFORMATIC / LABORATOR Clasa a XI-a

2014

for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
F>>V[i][j];
F.close();
for(i=1;i<=n;i++)
{
cout<<endl;
for(j=1;j<=m;j++)
cout<<V[i][j]<<" ";
}
}
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
cout<<endl;
for(int i=1;i<=k;i++)
cout<<V[i][A[i]]<<" ";
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]< m)
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
citire();
back();
}

9. PRODUS CARTEZIAN GENERAL. Se citete N natural. Se citesc N mulimi: A1, A2, , AN, coninnd
k1, k2, kN elemente (elementele unei mulimi sunt distincte). S se genereze produsul cartezian A1 X A2
X AN.
int A[100],V[10][10],n, m, T[10];
void citire()
{
int i,j;
fstream F("b09.txt",ios::in);
F>>n;
for(i=1;i<=n;i++)
{
F>>T[i];
for(j=1;j<=T[i];j++)
F>>V[i][j];
}
F.close();
for(i=1;i<=n;i++)
{
cout<<endl;
for(j=1;j<=m;j++)
cout<<V[i][j]<<" ";
}

10

INFORMATIC / LABORATOR Clasa a XI-a

2014

}
int solutie(int k)
{
return(k==n);
}
void tipar(int k)
{
fstream F ("b09.txt", ios::app);
F<<endl;
for(int i=1;i<=k;i++)
F<<V[i][A[i]]<<" ";
F.close();
}
void back()
{
for(int k=1;k<=n;k++)
A[k]=0;
k=1;
while(k>0)
{
while(A[k]<T[k])
{
A[k]++;
if(solutie(k))
tipar(k);
else
k++;
}
A[k--]=0;
}
}
void main()
{
citire();back();
}

10. SIR DE 0 SI 1. S se genereze toate irurile de numere de lungime N formate doar din elemente 0 i 1.
int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
void Sir_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)

11

INFORMATIC / LABORATOR Clasa a XI-a

2014

{
cout << "N="; cin >> N;
Sir_Back ();
}

12

INFORMATIC / LABORATOR Clasa a XI-a

2014

11. DRAPELE TRICOLORE. Avem la dispoziie 6 culori: alb, galben, rou, verde, albastru, negru. S se
precizez toate drapelele tricolore care se pot proiecta, tind c trebuie respectate urmtoarele reguli:
(Regula 1:) orice drapel are culoarea din mijloc galben sau verde, (Regula 2: ) cele trei culori de pe drapel
sunt distincte.
typedef char culoare[10];
culoare C[7];
int V[10];
void Incarca_Culori ()
{
strcpy (C[1], "galben");
strcpy (C[2], "rosu");
strcpy (C[3], "verde");
strcpy (C[4], "albastru");
strcpy (C[5], "alb");
strcpy (C[6], "negru");
}
int Solutie (int k)
{
return (k==3);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(10)<<C[V[j]]<< " ";
}
int Valid (int k)
{
if (k==2)
if ( (V[k]!=3)&&(V[k]!=1))
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Drapel_Back ()
{
for (int k=1; k<=6; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<6)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Incarca_Culori();
Drapel_Back ();
}
12. PARANTEZE. Se d un numr natural N par. S se determine toate irurile de N paranteze care se
nchid corect. Exemplu: N =6 ((( ))), (( )( )), ( )( )( ), ( )(( )), (( ))( )
int N, V[10];
int Solutie (int k)
{
for (int s=0, d=0, i=1; i<=k; i++)
(V[i]==1) ? (s++) : (d++);

13

INFORMATIC / LABORATOR Clasa a XI-a

2014

return ((s==d) && (k==N));


}
int Valid (int k)
{
for (int s=0, d=0, i=1; i<=k; i++)
(V[i]==1) ? (s++) : (d++);
return ((d<=s) && (s<=N/2));
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
if (V[j]==1)
cout << "(";
else
cout << ")";
}
void Paranteze_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<2)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Paranteze_Back ();
}
13. SUBMULIMILE UNUI MULIMI. Se consider o mulime A cu N elemete ntregi. S se genereze toate
submulimile acestei mulimi. Mulimea vid este submulime a oricrei mulimi.
int N, V[10], T[10];
void Citeste()
{
cout << "nr elemente: "; cin >> N;
for (int i= 1; i<= N; i++)
{
cout << "element " << i <<
" : ";
cin >> T[i];
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Submultimi_Back ()
{
for (int k=1; k<=N; k++)

14

INFORMATIC / LABORATOR Clasa a XI-a

2014

V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste();
Submultimi_Back ();
}
14. PARTIIILE UNEI MULIMI. Se consider mulimea {1, 2, , N}. Se cer toate partiiile acestei mulimi.
Submulimile A1, A2, , Ak constituie o partiie a mulimii A dac sunt disjuncte ntre ele i reuniunea lor
este mulimea A.
int N, V[10], T[10];
void Citeste ()
{
cout << "NR ELEMENTE: ";
cin >> N;
for (int i=1; i<= N; i++)
{
cout << "ELEMENT " << i << " : ";
cin >> T[i];
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int max = V[1], i=2; i<=k; i++)
if (max < V[i])
max = V[i];
for (i=1 ; i<= max ; i++)
{
cout << "{ ";
for (int j=1;j<=k; j++)
if (V[j]==i)
cout << T[j]<< " ";
cout << "}";
if (i!=max)
cout << " U ";
}
}
int Valid (int k)
{
for (int max = V[1], i=2; i<k; i++)
if (max < V[i])
max = V[i];
return (V[k]<=max+1);
}
void Partitii_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)

15

INFORMATIC / LABORATOR Clasa a XI-a

2014

{
while (V[k]<k)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste();
Partitii_Back ();
}
15. PROBLEMA COLORRII HARILOR. Find dat o hart cu N ri, se cer toate soluiile de colorare a
hrii utiliznd maxim 4 culori, astfel nct oricare dintre dou ri cu frontier comun s fie colorate cu
culori diferite.
typedef char culoare [20];
culoare C[5];
int N, V[10], A[10][10];
void Citeste (char * p)
{
strcpy (C[1], "rosu");
strcpy (C[2], "verde");
strcpy (C[3], "galben");
strcpy (C[4], "albastru");
fstream F(p, ios::in);
F>> N;
for (int i=1, j; i<= N; i++)
for (j=1 ;j<=N; j++)
A[i][j] = 0;
while (! F.eof ())
{
F>> i; char c=' ';
while ((c!= '\n') && (!F.eof()))
{
F>>j;
A[i][j]=1; A[j][i]=1;
c=F.get();
}
}
for (i=1; i<= N; i++)
{
cout << endl ;
for (j=1 ;j<=N; j++)
cout << A[i][j] << " ";
}
}
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(10)<< C[V[j]]<< " ";
}
int Valid (int k)
{
if (k>1)
for (int i=1; i<=k-1; i++)
if ((V[k]==V[i]) && (A[k][i]))
return 0;

16

INFORMATIC / LABORATOR Clasa a XI-a

2014

return 1;
}
void Colorare_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<4)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste("B15harta.txt");
Colorare_Back ();
}
16. PROBLEMA COMIS-VOIAJORULUI. Un comis-voiajor trebuie s viziteze un numr de N orae. Iniial
acesta se afl ntr-unul din ele notat 1. Comis-voiajorul dorete s nu treac de dou ori prin acelai ora
iar la ntoarcere s revin n oraul 1. Cunoscnd legturile dintre orae, se cere s se tipreasc toate
drumurile poibile pe care le poate efectua comis-voiajorul.
int N, V[10], A[10][10];
void Citeste (char * p)
{
fstream F (p, ios::in);
F>> N;
for (int i=1, j; i<= N; i++)
for (j=1 ;j<=N; j++)
A[i][j] = 0;
while (! F.eof ())
{
F>> i;
char c=' ';
while ((c!= '\n') && (!F.eof()))
{
F>>j;
A[i][j]=1; A[j][i]=1;
c=F.get();
}
}
for (i=1; i<= N; i++)
{
cout << endl ;
for (j=1 ;j<=N; j++)
cout << A[i][j] << " ";
}
F.close();
}
int Solutie (int k)
{
return ((k==N) && (A[V[1], V[k]]));
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << setw(3)<< V[j]<< " ";
cout << setw(3)<<V[1];
}

17

INFORMATIC / LABORATOR Clasa a XI-a

2014

int Valid (int k)


{
if (k>1)
if (!A[V[k-1]][V[k]])
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Comis_Back (int start )
{
for (int k=1; k<=N; k++)
V[k]=0;
V[1]=start;
k=2;
while (k>1)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste ("B16comis.txt");
Comis_Back (1);
}
17. PROBLEMA PLII unei sume S utiliznd N tipuri de monede. Se dau: suma S i N tipuri de monede
avnd valorile: a1, a2, .., an lei. Se cer toate modalitile de plat a sumei S utiliznd aceste monede.
int N, V[10];
long M[10], Max[10], S;
void Citeste (char * p)
{
fstream F(p, ios::in);
F>> N>> S;
for (int i=1; i<= N; i++)
{
F>>M[i];
Max[i] = S / M[i];
}
F.close();
}
int Solutie (int k)
{
long S=0;
for (int i=1; i<= k; i++)
S += V[i] * M[i];
return ( ::S == S );
}
fstream G("B17rez.txt", ios::out);
void Tipar (int k)
{
G << endl;
for (int i=1; i<= k-1; i++)
if (V[i])
G << V[i] << "*"<<M[i]<< " + ";
if (V[k])
G << V[k] << "*"<<M[k];
}
int Valid (int k)

18

INFORMATIC / LABORATOR Clasa a XI-a

2014

{
long S=0;
for (int i=1; i<= k; i++)
S += V[i] * M[i];
return ( ::S >= S );
}
void Monede_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<Max[k])
{
V[k] ++;
if (Valid(k))
{
if (Solutie(k))
Tipar (k);
else
if (k<N) k++;
}
else
V[k]=Max[k];
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI17mone.txt");
Monede_Back ();
}
18. PARTIIILE UNUI NUMR NATURAL. Se citete un numr natural N. Se cere s se tipreasc toate
modurile de descompunere a sa ca sum de numere naturale (Exemplu pentru numrul 4: 1111, 112, 121,
13, 211, ).
int N, V[10];
int Solutie (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S<=N);
}
void Partitii_Numar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N+1-k)
{
V[k] ++;
if (Valid(k))
{

19

INFORMATIC / LABORATOR Clasa a XI-a

2014

if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
else
V[k] = N+1-k;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Partitii_Numar_Back ();
}
19. DESCOMPUNERE. S se decompun un numr natural N n toate modurile posibile ca sum de p
numere naturale distincte. (p<=N).
int N,P, V[100];
int Solutie (int k)
{
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S==N) && (k==P);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k-1; j++)
cout <<setw(4)<< V[j]<< "
+";
cout <<setw(4)<< V[k] << " = " << N;
}
int Valid (int k)
{
for (int j=1; j<k; j++)
if (V[k]==V[j])
return 0;
for (int i=1, S=0; i<=k; i++)
S += V[i];
return (S<=N);
}
void Descompune_Numar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N+1-k)
{
V[k] ++;
if (Valid(k))
{
if (Solutie(k))
Tipar (k);
else
if (k<P)
k++;
}
else
V[k] = N+1-k;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;

20

INFORMATIC / LABORATOR Clasa a XI-a

2014

cout << "P="; cin >> P;


Descompune_Numar_Back ();
}

21

INFORMATIC / LABORATOR Clasa a XI-a

2014

20. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un numr natural N, se cere s se afieze
toate descompunerile numrului respectiv ca sum de numere prime.
int N, V[10];
int Suma (int k)
{
int S=0;
for (int i=1; i<=k ; i++)
S+=V[i];
return S;
}
int Prim (int x)
{
if (x<=1) return 0;
for (int i=2; i<=sqrt(x); i++)
if (x%i==0)
return 0;
return 1;
}
int Solutie (int k)
{
return (Suma(k)==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
return ((Prim(V[k])) && (Suma(k)<=N));
}
void Descompune_Prime_Back ()
{
for (int k=1; k<=N; k++)
V[k]=1;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Descompune_Prime_Back ();
}
21. DELEGAII. Dintr-un grup de N persoane, dintre care p femei, trebuie format o delegaie de K
persoane, din care L femei. S se precizeze toate delegaiile care se pot forma.
const NMAX = 10;
int N,P, K, L, V[NMAX], Min [NMAX], Max[NMAX];
int Solutie (int k)
{
return (k==K);
}
void Tipar (int k)
{
cout << endl;textcolor(RED);
for (int j=1; j<=L; j++)

22

INFORMATIC / LABORATOR Clasa a XI-a

2014

cprintf("F%d ", V[j]);


textcolor(BLUE);
for (j=L+1; j<=k; j++)
cprintf("B%d ", V[j]-P);
}
int Valid (int k)
{
if (k>1)
if (V[k]<V[k-1])
return 0;
for (int i=1; i<k;i++)
if (V[i]==V[k])
return 0;
return 1;
}
void Citeste()
{
cout << "Numar total persoane
: "; cin >> N;
cout << "Numar total femei
: "; cin >> P;
cout << "Numar persoane delegatie: "; cin >> K;
cout << "Numar femei delegatie
: "; cin >> L;
for (int i=1; i<=L; i++)
{
Min[i] = 0;
Max[i] = P;
}
for (i=L+1; i<=K; i++)
{
Min[i] = P;
Max[i] = N;
}
cout << endl<< "SE POT FORMA URMATOARELE DELEGATII : ";
textcolor (RED); cprintf ("FEMEI");
textcolor (BLUE); cprintf ("
ARBATI\n");
}
void Delegatii_Back ()
{
for (int k=1; k<=K; k++)
V[k]=Min[k];
k=1;
while (k>0)
{
while (V[k]<Max[k])
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=Min[k];
}
}
void main (void)
{
Citeste();
Delegatii_Back ();
}
22. ARANJAMENTE DE LITERE. Se citesc de la tastatur dou numere naturale N i M. (0<N<M<12). S se
afieze toate irurile de litere distincte, litere alese dintre primele m litere mari ale alfabetului englez. De
exemplu pentru N=2 i M=4: AB, AC, AD, BA, BC, BD, CA, CB, CD, DA, DB, DC.
int N, P, V[10];
int Solutie (int k)
{
return (k==P);
}
void Tipar (int k)
{

23

INFORMATIC / LABORATOR Clasa a XI-a

2014

cout << endl;


for (int j=1; j<=k; j++)
cout << char(V[j])<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Litere_Back ()
{
for (int k=1; k<=N; k++)
V[k]='A'-1;
k=1;
while (k>0)
{
while (V[k]<N+'A'-1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]='A'-1;
}
}
void main (void)
{
cout << "Primele cate litere ale alfabetului ? "; cin >> N;
cout << "Cate litere va contine un sir ? ";
cin >> P;
Litere_Back ();
}
23. DESCOMPUNERE N NUMRE CONSECUTIVE. Se d un numr natural N > 5 . S se afieze toate
descompunerile lui N ca sum de numere naturale
int N, V[101];
int Suma (int k)
{
for (int i=1, S=0; i<=k ; i++)
S+=V[i];
return S;
}
int Solutie (int k)
{
return (Suma(k)==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (k>1)
if (V[k]!=V[k-1]+1)
return 0;
if (Suma(k)>N)
return 0;
return 1;
}
void
Descompune_Numere_Consecutive_Back ()
{
for (int k=1; k<=N; k++)
V[k]=1;
k=1;

24

INFORMATIC / LABORATOR Clasa a XI-a

2014

while (k>0)
{
while (V[k]<N-1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Descompune_Numere_Consecutive_Back ();
}
24. COTROCENI. La palatul COTROCENI se ine o conferin de pres la care trebue s ia cuvntul 5
purttori de cuvnt numii A, B, C, D, E. Afiai toate modurile de nscriere la cuvnt astfel nct persoana
A s vorbeasc mai trziu dect persoana D i persoana E s fie printre primele trei persoane care
vorbesc.
int V[10];
fstream F("cotrocen.txt", ios::out);
int Solutie (int k)
{
return (k==5);
}
void Tipar (int k)
{
F << endl;
for (int j=1; j<=k; j++)
F << char(V[j]+64)<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (V[k]==1)
for (i=1; i<k; i++)
if (V[i]==4)
return 0;
if (V[k]==5)
if (k>3)
return 0;
return 1;
}
void Cotroceni_Back ()
{
for (int k=1; k<=5; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<5)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}

25

INFORMATIC / LABORATOR Clasa a XI-a

2014

}
void main (void)
{
Cotroceni_Back ();
}
25. SUBMULIMI DE SUMA S. S se genereze toate submulimile de cte M elemente ale unei mulimi de
N elemente pentru care suma elementelor s nu depeasc o valoare maxim Smax.
int N, M, V[10], T[10], Smax;
int Nr_Elemente (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
return nr;
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S+=T[i];
return S;
}
int Valid (int k)
{
return (Suma(k)<=Smax);
}
void Citeste()
{
cout << "nr elemente: "; cin >> N;
for (int i= 1; i<= N; i++)
{
cout << "element " << i <<
" : ";
cin >> T[i];
}
cout<< "M= (nr de elem ale submultimii) ";
cin >> M;
cout<< "Smax= (Suma maxima) ";
cin >> Smax;
}
int Solutie (int k)
{
return (Nr_Elemente(k)==M);
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Submultimi_Suma_Data_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else

26

INFORMATIC / LABORATOR Clasa a XI-a


if (k<N)

2014

k++;

}
V[k--]=-1;
}
}
void main (void)
{
Citeste();
Submultimi_Suma_Data_Back ();
}
26. EXAMEN. S se elaboreze toate modalitile de a promova un examen care conine N probe, tiind c
la fiecare prob (i) se poate obine un punctaj ntre 1 i (P[i]) iar pentru a fi promovat, un candidat trebuie
s obin mcar M puncte.
int N, M,V[10], P[10];
void Citeste ()
{
cout << "Numar de probe "; cin >> N;
for (int i=1; i<=N; i++)
{
cout << "Punctaj maxim test " << i << " ";
cin >> P[i];
}
cout << "Punctaj minim necesar: " ; cin >> M;
}
int Punctaj (int k)
{
for (int i=1, S=0; i<=k; i++)
S+=V[i];
return S;
}
int Solutie (int k)
{
return (k==N) && (Punctaj(k)>=M);
}
void Tipar (int k)
{
cout << endl<<"--------------------------------";
for (int j=1; j<=k; j++)
cout<<endl<< "test "<<j << " Puncte : "<<V[j];
}
void Examen ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<P[k])
{
V[k] ++;
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste();
Examen();
}
27. SIR FR NUMERE CONSECUTIVE. S se alctuiasc toate irurile posibile de cte N numere
naturale distincte alese din primele N numere naturale astfel nct s nu existe dou numere consecutive
aezate alturi.

27

INFORMATIC / LABORATOR Clasa a XI-a

2014

int N, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (k>1)
if (abs(V[k]-V[k-1])==1)
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Fara_Consecutive_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "N="; cin >> N;
Fara_Consecutive_Back ();
}
28. MATRICE PATRATIC BINAR. SIMETRIC. S se genereze toate matricile ptratice de dimensiune N,
formate doar cu elemente 0 i 1, simetrice fa de diagonala principal i cu diagonala principal 0.
int N, V[100], A[10][10];
int Solutie (int k)
{
return (k==(N*(N-1)/2));
}
void Afisare ()
{
cout << "------------------------"<<endl;
for (int i=1; i<=N; i++)
{
for (int j=1; j<=N; j++)
cout << A[i][j]<< " ";
cout << endl;
}
}
void Tipar ()
{
for (int i=1, p=1; i<= N-1; i++)
for (int j=i+1; j<=N; j++)
{

28

INFORMATIC / LABORATOR Clasa a XI-a

2014

A[i][j] = V[p];
A[j][i] = V[p];
p++;
}
Afisare();
}
void Matr_Sim_Back ()
{
for (int k=1; k<=N*(N-1)/2; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Solutie(k))
Tipar ();
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
cout << "N="; cin >> N;
Matr_Sim_Back ();
}
29. MATRICE BINARA CU UN maxim N de 1. S se genereze toate matricile ptratice de dimensiune N,
formate doar cu elemente 0 i 1 cu proprietatea c pe fiecare linie exist un singur 1i pe fiecare coloan
apare o singur dat cifra 1.
int N, V[10], A[10][10];
fstream F("BI29mlc1.txt", ios::out);
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
int i, j;
for (i=1 ; i<= k; i++)
for (j=1; j<=k; j++)
A[i][j]=0;
for (i=1 ; i<=k; i++)
if (V[i])
A[i][V[i]]=1;
F << endl<<"----------------------";
for (i=1; i<=k; i++)
{
F << endl;
for (j=1; j<=k; j++)
F << A[i][j]<< " ";
}
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k])
if (V[k]==V[i])
return 0;
return 1;
}
void Matrice_LC1_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;

29

INFORMATIC / LABORATOR Clasa a XI-a

2014

k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
cout << "N="; cin >> N;Matrice_LC1_Back ();
F.close();
}
30. TEZE. O clas de elevi trebuie s programeze M teze n N zile. Determinai toate posibilitile de
programare a tezelor tiind c nu se pot susine dou teze n aceeai zi.
int N, M, V[10];
int Solutie (int k)
{
return (k==M);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << endl<<"TEZA "<< j<< " In ziua: "<<V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])return 0;
return 1;
}
void Teze_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "Numar zile: "; cin >> N;
cout << "Numar teze: "; cin >> M;
Teze_Back ();
}
31. MELODII. S se genereze toate posibilitile de a aranjare pe o caset a N melodii, astfel nct melodia
x s se cnte dup melodia y.
int N, V[100], x, y;

30

INFORMATIC / LABORATOR Clasa a XI-a

2014

int Solutie (int k)


{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
for (i=1; i<= k; i++)
if (V[i]==y)
for (int j=1; j<i; j++)
if (V[j]==x)
return 0;
return 1;
}
void Melodii_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "Numar melodii: "; cin >> N;
cout << "Melodia X: "; cin >> x;
cout << "Melodia Y: "; cin >> y;
Melodii_Back ();}
32. CUBURI. Se consider N cuburi numerotate de la 1 la N, de laturi i culori diferite. S se genereze
toate turnurile posibile formate din M cuburi astfel nct turnurile s aib stabilitate (nu aezm un cub
mai mare peste un cub mai mic) i s nu existe dou cuburi de aceeai culoare consecutive.
typedef char culoare [20];
culoare C[10];
int N, M, V[10], D[10];
void Citeste (char * p)
{
fstream F(p, ios::in);
F>>N>>M;
for (int i=1; i<= N; i++)
{
F>>D[i];
F>>C[i];
}
}
int Solutie (int k)
{
return (k==M);
}
void Tipar (int k)
{

31

INFORMATIC / LABORATOR Clasa a XI-a

2014

cout << "-------------------"<< endl;


cout << "DIMENSIUNE CULOARE"<<endl;
for (int j=k; j>=1; j--)
cout<<" "<<D[V[j]]<<"
"<<C[V[j]]<<endl;
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (k>1)
{
if (D[V[k]]>D[V[k-1]])
return 0;
if (!strcmp(C[V[k]], C[V[k-1]]))
return 0;
}
return 1;
}
void Cubu_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste("BI32cubu.txt");
Cubu_Back ();
}
33. NUMERE BINE ORDONATE. S se genereze toate numerele bine ordonate descresctor formate din 3
cifre. Un numr este bine ordonat descresctor dac are toate cifrele distincte i n ordine strict
descresctoare.
int V[4];
void Tipar ()
{
int S=0;
for (int i=1; i<= 3; i++)
{
S*=10;
S+=V[i];
}
cout << S<< " ";
}
int Valid (int k)
{
if ((k==1)&&(!V[k]))
return 0;
if ((k>1)&&(V[k]>V[k-1]))
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;

32

INFORMATIC / LABORATOR Clasa a XI-a

2014

}
void Bine_Ordonate_Back ()
{
for (int k=1; k<=9; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<9)
{
V[k] ++;
if (Valid(k))
if (k==3)
Tipar ();
else
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Bine_Ordonate_Back ();
}
34. Se citete un numr natural N i un numr natural V, (V<N). S se afieze toate modurile n care pot fi
aranjate numerele de la 1 la N astfel nct diferena n modul dintre dou numere alturate s fie mai mic
sau egal dect V.
int N,v, V[10];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
int Valid (int k)
{
if (k>1)
if (abs(V[k]-V[k-1])>v)
return 0;
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
return 1;
}
void Diferenta_Modul_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}

33

INFORMATIC / LABORATOR Clasa a XI-a

2014

void main (void)


{
cout << "N="; cin >> N;
cout << "V="; cin >> v;
Diferenta_Modul_Back ();
}
35. Se d un cuvnt de lungime N, format din caractere distincte. S se afieze toate cuvintele de lungime
N care se pot forma cu caracterele cuvntului dat i care ndeplinesc condiia c nu exist dou
consoane sau dou vocale alturate. (n cadrul cuvintelor generate caracterele nu se repet).
int N, V[20];
char s[20];
int Solutie (int k)
{
return (k==N);
}
void Tipar (int k)
{
cout << " ";
for (int j=1; j<=k; j++)
cout << s[V[j]];
}
int Vocala (char x)
{
return (toupper(x)=='A')||(toupper(x)=='E')||
(toupper(x)=='I')||(toupper(x)=='O')||
(toupper(x)=='U'));
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (k>1)
if ( (Vocala(s[V[k-1]]) + Vocala(s[V[k]]))!=1)
return 0;
return 1;
}
void Vocale_Consoane_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<N)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "CUVANT CU LITERE DISTINCTE: ";
cin >> s; N=strlen(s);
for (int i= N; i>0; i--)
s[i]=s[i-1];
Vocale_Consoane_Back ();
}
36. Fie A = {2, 5, 6, 7, 8}. Afiai toate numerele care se pot forma cu aceste cifre, astfel nct s nu existe
dou cifre pare sau dou cifre impare alturate.
int N=5, V[6], T[]={0, 2, 5, 6, 7, 8};
void Tipar ()
{
long Nr=0;
for (int j=1; j<=5; j++)
{
Nr *= 10;
Nr += (long)T[V[j]];

34

INFORMATIC / LABORATOR Clasa a XI-a

2014

}
cout << Nr<< " ";
}
int Valid (int k)
{
for (int i=1; i<=k-1; i++)
if (V[k]==V[i])
return 0;
if (k>1)
if ((T[V[k]]%2 + T[V[k-1]]%2) !=1)
return 0;
return 1;
}
void Par_Impar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;
k=1;
while (k>0)
{
while (V[k]<5)
{
V[k] ++;
if (Valid(k))
if (k==5)
Tipar ();
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Par_Impar_Back ();
}
37. S se genereze N vectori de lungime P cu elemente 1 i 2 cu proprietatea c suma elementelor este
egal cu un S dat.
int N,S,P ,V[100];
void Tipar (int &k)
{
if (N)
{
N--;
cout << endl;
for (int j=1; j<=k; j++)
cout << V[j]<< " ";
}
else
{
V[k]=2;
k=0;
}
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
S+=V[i];
return S;
}
void Vectori_Back ()
{
for (int k=1; k<=N; k++)
V[k]=0;

35

INFORMATIC / LABORATOR Clasa a XI-a

2014

k=1;
while (k>0)
{
while (V[k]<2)
{
V[k] ++;
if (Suma(k)<=S)
if ((k==P)&&(Suma(k)==S))
Tipar (k);
else
if (k<P)
k++;
}
V[k--]=0;
}
}
void main (void)
{
cout << "Numar vectori "; cin >> N;
cout << "Suma "; cin >> S;
cout << "Lungime vectori "; cin >> P;
Vectori_Back ();
if (N)
cout << "nu s-au gasit toate solutiile cerute";
}
38. Se consider n obiecte avnd greutile g1, g2, , gN. S se afieze toate posibilitile de a echilibra o
balan ce are pe braul din stnga un obiect de greutate G. Determinai soluia la care echilibrarea se
face cu numr minim de greuti.
int N, G[100], V[100], M, Min, Minim[100];
void Citeste (char * p)
{
fstream F(p, ios::in);
F>>N>>M;
for (int i=1; i<=N; i++)
F>> G[i];
F.close();
Min = N+1;
}
int Suma (int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S+=G[i];
return S;
}
int Solutie (int k)
{
return (Suma(k)==M);
}
void Tipar (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
if (nr<Min)
{
Min = nr;
int p=1;
for (int j=1; j<=k; j++)
if (V[j])
Minim[p++]= G[j];
}
cout << endl;
for (int j=1; j<=k; j++)
if (V[j])
cout << G[j]<< " ";
}

36

INFORMATIC / LABORATOR Clasa a XI-a

2014

int Valid (int k)


{
return (Suma(k)<=M);
}
void Cantar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI38greu.txt"); Cantar_Back ();
cout
<<
endl
<<
endl
<<
"Echilibrarea cu cele mai putine greutati: " << endl;
for (int j=1; j<=Min; j++)
cout << Minim[j] << " ";
}
39. S se elaboreze toate variantele de chestionare care se pot obine dintr-un set de N ntrebri care s
aib ntre a i b ntrebri, iar la fiecare chestionar trebuie s se totalizeze ntre p i q puncte. Se cunoate
punctajul fiecrei ntrebri.
int N, V[10], T[10], p, q, a, b;
void Citeste(char * fisier)
{
fstream F(fisier, ios::in);
F>>N>>a>>b>>p>>q;
for (int i= 1; i<= N; i++)
F >> T[i];
F.close();
}
int Numar_intrebari (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
return nr;
}
int Punctaj_acumulat(int k)
{
for (int i=1, pct=0; i<=k; i++)
if (V[i])
pct += T[i];
return pct;
}
int Valid (int k)
{
if (Numar_intrebari (k)>b)
return 0;
if (Punctaj_acumulat(k)>q)
return 0;
return 1;
}
int Solutie (int k)
{
if (Punctaj_acumulat(k)<p)

37

INFORMATIC / LABORATOR Clasa a XI-a

2014

return 0;
if (Numar_intrebari(k)<a)
return 0;
return 1;
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Chestionar_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI39ches.txt");
Chestionar_Back ();
}
40. S se genereze toate submulimile de cte M elemente a unei mulimi de N numere naturale pentru
care suma elementelor s se ncadreze n intervalul [a,b].
int N, M, V[10], T[10], a, b;
void Citeste(char * fisier)
{
fstream F(fisier, ios::in);
F>>N>>M>>a>>b;
for (int i= 1; i<= N; i++)
F >> T[i];
F.close();
}
int Numar_elemente (int k)
{
for (int i=1, nr=0; i<=k; i++)
if (V[i])
nr++;
return nr;
}
int Suma_acumulata(int k)
{
for (int i=1, S=0; i<=k; i++)
if (V[i])
S += T[i];
return S;
}
int Valid (int k)
{
if (Numar_elemente (k) > M)
return 0;
if (Suma_acumulata(k)>b)

38

INFORMATIC / LABORATOR Clasa a XI-a

2014

return 0;
return 1;
}
int Solutie (int k)
{
if (Numar_elemente(k)!=M)
return 0;
if (Suma_acumulata(k)<a)
return 0;
return 1;
}
void Tipar (int k)
{
cout << endl<< " { ";
for (int j=1; j<=k; j++)
if (V[j])
cout << T[j]<< " ";
cout << "}";
}
void Submultimi_Suma_Interval_Back ()
{
for (int k=1; k<=N; k++)
V[k]=-1;
k=1;
while (k>0)
{
while (V[k]<1)
{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
if (k<N)
k++;
}
V[k--]=-1;
}
}
void main (void)
{
Citeste("BI40smni.txt");
Submultimi_Suma_Interval_Back ();
}
FISIERE HEADER
# include <fstream.h>
# include <string.h>
# include <conio.h>
# include <math.h>
# include <iomanip.h>
# include <ctype.h>
FISERE TEXT
Problema 8
3 2
1 5
7 4
-1 10
Problema 9
4
3
1 2 3
3

39

INFORMATIC / LABORATOR Clasa a XI-a

2014

4 5 6
2
7 8
2
9 10
Problema 15
7
1 2 3 4 5 6 7
2 3 4
3 4 6 7
4 5 7
5 7
6 7

Problema 16
6
1 2 3 5 6
2 3 4
3 4
4 5 6
5 6
Problema 17
5
1430000
10000 50000 100000 500000 1000000
Problema 32
4 3
2 rosu
3 galben
4 rosu
2 verde
Problema 38
7 15
10 2 3 4 5 6 1
Problema 39
5
3 4
15 20
8 7 10 5 8
Problema 40
5
3
2 8
1 2 3 4 5

40

INFORMATIC / LABORATOR Clasa a XI-a

2014

41

S-ar putea să vă placă și