You are on page 1of 38

INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

BACKTRACKING. PROBLEME

ENUNŢURI PROBLEME – FIŞĂ DE LUCRU

Probleme lucrare practică

1. PERMUTĂRI. Se citeşte un număr natural N. Să se genereze permutările mulţimi {1, 2, …,


N};
2. ARANJAMENTE. Se citesc două numere naturale N şi P (P<=N). Să se genereze toate
submulţimile mulţimii {1, 2, …, N} de câte P elemente. Două submulţimi cu aceleaşi
elemente la care ordinea acestora diferă sut considerate distincte. Mulţimea {1, 2, 3} este
diferită de mulţimea {1, 3, 2}
3. COMBINĂRI. Se citesc două numere naturale N şi P (P<=N). Să se genereze toate
submulţimile mulţimii {1, 2, …, N} de P elemente. Două submulţimi se consideră egale,
dacă şi numai dacă au aceleaşi elemente, indiferent de ordinea în care acestea apar.
Mulţimea {1, 2, 3} NU este diferită de mulţimea {1, 3, 2}
4. PERMUTĂRI GENERALE. Se citeşte N natural. Se citesc N numere întregi distincte. Să se
genereze permutările mulţimii formate din numerele citite.
5. PERMUTĂRI DE CUVINTE. Se citeşte N natural. Se citesc N cuvinte. Să se genereze
permutările mulţimii formate din cuvintele citite.
6. DAME. Se citeşte N natural. Să se aşeze N dame pe o tablă de şah de dimensiune N astfel
încât oricare două dintre cele N dame să nu se atace. Două dame se atacă dacă sunt pe
aceeaşi linie sau pe aceeaşi coloană sau pe aceeaşi diagonală.
7. PRODUS CARTEZIAN. Se citeşte 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 mulţimi cu câte M elemente. Se citeşte N natural. Se citesc N
mulţimi: A1, A2, …, AN, fiecare conţinând câte M elemente (elementele unei mulţimi sunt
distincte). Să se genereze produsul cartezian A1 X A2 X … AN.
9. PRODUS CARTEZIAN GENERAL. Se citeşte N natural. Se citesc N mulţimi: A1, A2, …, AN,
conţinând k1, k2, …kN elemente (elementele unei mulţimi 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 dispoziţie 6 culori: alb, galben, roşu, verde, albastru, negru.
Să se precizez toate drapelele tricolore care se pot proiecta, ştind că trebuie respectate
următoarele 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 număr natural N par. Să se determine toate şirurile de N paranteze
care se închid corect. Exemplu: N =6 ((( ))), (( )( )), ( )( )( ), ( )(( )), (( ))( )
13. SUBMULŢIMILE UNUI MULŢIMI. Se consideră o mulţime A cu N elememte întregi. Să se
genereze toate submulţimile acestei mulţimi. Mulţimea vidă este submulţime a oricărei
mulţimi. Orice mulţime A este considerată submulţime a mulţimii A.
14. PARTIŢIILE UNEI MULŢIMI. Se consideră mulţimea A= {1, 2, …, N}. Se cer toate partiţiile
acestei mulţimi. Submulţimile A1, A2, …, Ak constituie o partiţie a mulţimii A dacă sunt
disjuncte între ele şi reuniunea lor este mulţimea A. Exemplu: o partiţie a mulţimii {1, 2,
3} este {1, 2} U {3}.

1
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

15. PROBLEMA COLORĂRII HARŢILOR. Find dată o hartă cu N ţări, se cer toate soluţiile de
colorare a hărţii utilizând maxim 4 culori, astfel încât oricare dintre două ţări cu frontieră
comună să fie colorate cu culori diferite.

16. PROBLEMA COMIS-VOIAJORULUI. Un comis-voiajor trebuie să viziteze un număr de N


oraşe. Iniţial acesta se află într-unul din ele notat 1. Comis-voiajorul doreşte să nu treacă
de două ori prin acelaşi oraş iar la întoarcere să revină în oraşul 1. Cunoscând legăturile
dintre oraşe, se cere să se tipărească toate drumurile poibile pe care le poate efectua
comis-voiajorul.
17. PROBLEMA PLĂŢII unei sume S utilizând N tipuri de monede. Se dau: suma S şi N tipuri de
monede având valorile: a1, a2, .., an lei. Se cer toate modalităţile de plată exactă a sumei
S utilizând aceste monede.
18. PARTIŢIILE UNUI NUMĂR NATURAL. Se citeşte un număr natural N. Se cere să se
tipărească toate modurile de descompunere a sa ca sumă de numere naturale (Exemplu:
pentru numărul 4: 1111, 112, 121, 13, 211, …).
19. DESCOMPUNERE. Să se decompună un număr 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 număr natural N, se cere să
se afişeze toate descompunerile numărului respectiv ca sumă de numere prime.
21. DELEGAŢII. Dintr-un grup de N persoane, dintre care p femei, trebuie formată o delegaţie
de K persoane, din care L femei. Să se precizeze toate delegaţiile 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 afişeze 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 număr natural N > 5 . Să se afişeze
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
cuvântul 5 purtători de cuvânt numiţi A, B, C, D, E. Afişaţi toate modurile de înscriere la
cuvânt astfel încât persoana A să vorbească mai târziu decât persoana D şi persoana E să
fie printre primele trei persoane care vorbesc.
25. SUBMULŢIMI DE SUMA S. Să se genereze toate submulţimile de câte M elemente ale unei
mulţimi de N elemente pentru care suma elementelor să nu depăşească o valoare
maximă Smax.
26. EXAMEN. Să se elaboreze toate modalităţile de a promova un examen care conţine N
probe, ştiind că la fiecare probă (i) se poate obţine un punctaj între 1 şi (P[i]) iar pentru a
fi promovat, un candidat trebuie să obţină măcar M puncte.
27. SIR FĂRĂ NUMERE CONSECUTIVE. Să se alcătuiască toate şirurile posibile de câte N
(0<N<=9) numere naturale distincte alese din primele N numere naturale fără 0 (1, 2, ..,
N) astfel încât să nu existe două numere consecutive aşezate alături. 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 pătratice de
dimensiune N, formate doar cu elemente 0 şi 1, simetrice faţă de diagonala principală şi
cu diagonala principală 0.
29. MATRICE BINARA CU maxim UN 1 pe fiecare COLOANA ŞI pe fiecare LINIE. Să se
genereze toate matricile pătratice de dimensiune N, formate doar cu elemente 0 şi 1 cu

2
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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. Determinaţi toate
posibilităţile de programare a tezelor ştiind că nu se pot susţine două teze în aceeaşi zi.
31. MELODII. Să se genereze toate posibilităţile de a aranjare pe o casetă a N melodii, astfel
încât melodia x să se cânte 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 încât turnurile să aibă
stabilitate (nu aşezăm un cub mai mare peste un cub mai mic) şi să nu existe două cuburi
de aceeaşi culoare consecutive.
33. NUMERE BINE ORDONATE. Să se genereze toate numerele bine ordonate descrescător
formate din 3 cifre. Un număr este bine ordonat descrescător dacă are toate cifrele
distincte şi în ordine strict descrescătoare.
34. Se citeşte un număr natural N şi un număr natural V, (V<N). Să se afişeze toate modurile
în care pot fi aranjate numerele de la 1 la N astfel încât diferenţa în modul dintre două
numere alăturate să fie mai mică sau egală decăt V.
35. Se dă un cuvânt de lungime N, format din caractere distincte. Să se afişeze toate cuvintele
de lungime N care se pot forma cu caracterele cuvântului dat şi care îndeplinesc condiţia
că nu există două consoane sau două vocale alăturate. (în cadrul cuvintelor generate
caracterele nu se repetă).
36. Fie A = {2, 5, 6, 7, 8}. Afişaţi toate numerele care se pot forma cu aceste cifre, astfel încât
să nu existe două cifre pare sau două cifre impare alăturate. Numerele vor conţine 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 având greutăţile g1, g2, …, gN. Să se afişeze toate posibilităţile de
a echilibra o balanţă ce are pe braţul din stânga un obiect de greutate G. Determinaţi
soluţia la care echilibrarea se face cu număr minim de greutăţi.
39. Să se elaboreze toate variantele de chestionare care se pot obţine dintr-un set de N
întrebări care să aibă între a şi b întrebări, iar la fiecare chestionar trebuie să se totalizeze
între p şi q puncte. Se cunoaşte punctajul fiecărei întrebări.
40. Să se genereze toate submulţimile de câte M elemente a unei mulţimi de N numere
naturale pentru care suma elementelor să se încadreze în intervalul [a,b].
41. Un grup de N turişti au la dispoziţie P corturi de capacităţi k1, k2, ..kp. Să se determine
toate posibilităţile de a caza cei N turişti astfel încât să nu rămână nici un cort gol şi nici
un turist afară. Dacă nu există nici o solutie se va afişa mesajul corespunzător.
42. Doi hoti au jefuit o bancă şi au furat N saci cu bani. Pe fiecare sac scrie câţi bani se află în
sacul respectiv. Să se afişeze toate posibilităţile de a împărţi sacii cu bani astfel încât cei
doi hoţi să primească aceeaşi sumă de bani. În cazul în care suma totală nu se poate
împărţi exact se va afişa un mesaj corespunzător.

3
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

1. PERMUTĂRI. Se citeşte un număr natural N. Să se genereze permutările mulţimi {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 submulţimile mulţimii {1, 2, …, N}
de P elemente. Două submulţimi cu aceleaşi 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++)
V[k]=0;

4
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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. COMBINĂRI. Se citesc două numere naturale N şi P (P<=N). Să se genereze toate submulţimile mulţimii {1, 2, …, N} de P
elemente. Două submulţimi se consideră egale, dacă şi numai dacă au aceleaşi 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;
Combinari_Back ();

5
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
4. PERMUTARI GENERALE. Se citeşte N natural. Se citesc N numere întregi. Să se genereze permutările mulţimii 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. PERMUTĂRI DE CUVINTE. Se citeşte N natural. Se citesc N cuvinte. Să se genereze permutările mulţimii 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];
}
}
int Solutie (int k)

6
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

{
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 citeşte N natural. Să se aşeze N dame pe o tablă de şah de dimensiune N astfel încât oricare două dintre cele
N dame să nu se atace. Două dame se atacă dacă sunt pe aceeaşi linie sau pe aceeaşi coloană sau pe aceeaşi 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 ()
{
for (int k=1; k<=N; k++)

7
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 citeşte 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 mulţimi cu câte M elemente. Se citeşte N natural. Se citesc N mulţimi: A1, A2, …, AN, fiecare
conţinând câte M elemente (elementele unei mulţimi 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;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
F>>V[i][j];
F.close();

8
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 citeşte N natural. Se citesc N mulţimi: A1, A2, …, AN, conţinând k1, k2, …kN
elemente (elementele unei mulţimi 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]<<" ";
}
}
int solutie(int k)
{
return(k==n);

9
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
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)
{
cout << "N="; cin >> N;
Sir_Back ();
}

10
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

11. DRAPELE TRICOLORE. Avem la dispoziţie 6 culori: alb, galben, roşu, verde, albastru, negru. Să se precizez toate
drapelele tricolore care se pot proiecta, ştind că trebuie respectate următoarele 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 număr 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++);
return ((s==d) && (k==N));

11
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
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. SUBMULŢIMILE UNUI MULŢIMI. Se consideră o mulţime A cu N elemete întregi. Să se genereze toate submulţimile
acestei mulţimi. Mulţimea vidă este submulţime a oricărei mulţimi.
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++)
V[k]=-1;

12
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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. PARTIŢIILE UNEI MULŢIMI. Se consideră mulţimea {1, 2, …, N}. Se cer toate partiţiile acestei mulţimi. Submulţimile A1,
A2, …, Ak constituie o partiţie a mulţimii A dacă sunt disjuncte între ele şi reuniunea lor este mulţimea 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)
{
while (V[k]<k)

13
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

{
V[k] ++;
if (Valid(k))
if (Solutie(k))
Tipar (k);
else
k++;
}
V[k--]=0;
}
}
void main (void)
{
Citeste();
Partitii_Back ();
}
15. PROBLEMA COLORĂRII HARŢILOR. Find dată o hartă cu N ţări, se cer toate soluţiile de colorare a hărţii utilizând
maxim 4 culori, astfel încât 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;
return 1;
}
void Colorare_Back ()

14
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

{
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 număr de N oraşe. Iniţial acesta se află într-
unul din ele notat 1. Comis-voiajorul doreşte să nu treacă de două ori prin acelaşi oraş iar la întoarcere să revină în oraşul
1. Cunoscând legăturile dintre oraşe, se cere să se tipărească 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];
}
int Valid (int k)
{
if (k>1)

15
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 PLĂŢII unei sume S utilizând N tipuri de monede. Se dau: suma S şi N tipuri de monede având valorile: a1,
a2, .., an lei. Se cer toate modalităţile de plată a sumei S utilizând 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)
{
long S=0;
for (int i=1; i<= k; i++)

16
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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. PARTIŢIILE UNUI NUMĂR NATURAL. Se citeşte un număr natural N. Se cere să se tipărească toate modurile de
descompunere a sa ca sumă de numere naturale (Exemplu pentru numărul 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))
{
if (Solutie(k))
Tipar (k);
else
if (k<N)

17
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 număr 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;
cout << "P="; cin >> P;
Descompune_Numar_Back ();
}

18
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

20. DESCOMPUNERE CA SUMA DE NUMERE PRIME. Fiind dat un număr natural N, se cere să se afişeze toate
descompunerile numărului 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. DELEGAŢII. Dintr-un grup de N persoane, dintre care p femei, trebuie formată o delegaţie de K persoane, din care L
femei. Să se precizeze toate delegaţiile 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++)

19
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 afişeze 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)
{

20
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 număr natural N > 5 . Să se afişeze 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;

21
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 cuvântul 5 purtători de cuvânt
numiţi A, B, C, D, E. Afişaţi toate modurile de înscriere la cuvânt astfel încât persoana A să vorbească mai târziu decât
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;
}
}

22
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

void main (void)


{
Cotroceni_Back ();
}

25. SUBMULŢIMI DE SUMA S. Să se genereze toate submulţimile de câte M elemente ale unei mulţimi de N elemente
pentru care suma elementelor să nu depăşească 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
if (k<N) k++;

23
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
V[k--]=-1;
}
}
void main (void)
{
Citeste();
Submultimi_Suma_Data_Back ();
}
26. EXAMEN. Să se elaboreze toate modalităţile de a promova un examen care conţine N probe, ştiind că la fiecare probă
(i) se poate obţine un punctaj între 1 şi (P[i]) iar pentru a fi promovat, un candidat trebuie să obţină măcar 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 FĂRĂ NUMERE CONSECUTIVE. Să se alcătuiască toate şirurile posibile de câte N numere naturale distincte alese
din primele N numere naturale astfel încât să nu existe două numere consecutive aşezate alături.
int N, V[10];
int Solutie (int k)
{

24
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 pătratice 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++)
{
A[i][j] = V[p];
A[j][i] = V[p];
p++;

25
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
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 pătratice 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.
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;
k=1;
while (k>0)
{
while (V[k]<N)

26
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

{
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. Determinaţi toate posibilităţile de programare a tezelor
ştiind că nu se pot susţine două teze în aceeaşi 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 posibilităţile de a aranjare pe o casetă a N melodii, astfel încât melodia x să se cânte
după melodia y.
int N, V[100], x, y;
int Solutie (int k)
{
return (k==N);
}

27
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 încât turnurile să aibă stabilitate (nu aşezăm un cub mai mare peste un cub mai mic)
şi să nu existe două cuburi de aceeaşi 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)
{
cout << "-------------------"<< endl;
cout << "DIMENSIUNE CULOARE"<<endl;
for (int j=k; j>=1; j--)
cout<<" "<<D[V[j]]<<" "<<C[V[j]]<<endl;

28
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

}
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 descrescător formate din 3 cifre. Un număr
este bine ordonat descrescător dacă are toate cifrele distincte şi în ordine strict descrescătoare.

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;
}
void Bine_Ordonate_Back ()
{
for (int k=1; k<=9; k++)
V[k]=-1;

29
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 citeşte un număr natural N şi un număr natural V, (V<N). Să se afişeze toate modurile în care pot fi aranjate
numerele de la 1 la N astfel încât diferenţa în modul dintre două numere alăturate să fie mai mică sau egală decăt 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;
}
}
void main (void)
{ cout << "N="; cin >> N;
cout << "V="; cin >> v;
Diferenta_Modul_Back ();
}

30
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

35. Se dă un cuvânt de lungime N, format din caractere distincte. Să se afişeze toate cuvintele de lungime N care se pot
forma cu caracterele cuvântului dat şi care îndeplinesc condiţia că nu există două consoane sau două vocale alăturate. (î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}. Afişaţi toate numerele care se pot forma cu aceste cifre, astfel încât să nu existe două cifre pare
sau două cifre impare alăturate.
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]];
}
cout << Nr<< " ";
}
int Valid (int k)
{

31
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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;
k=1;
while (k>0)
{
while (V[k]<2)
{
V[k] ++;

32
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 având greutăţile g1, g2, …, gN. Să se afişeze toate posibilităţile de a echilibra o balanţă ce are
pe braţul din stânga un obiect de greutate G. Determinaţi soluţia la care echilibrarea se face cu număr minim de greutăţi.
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]<< " ";

}
int Valid (int k)
{
return (Suma(k)<=M);
}
void Cantar_Back ()
{
for (int k=1; k<=N; k++)

33
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 obţine dintr-un set de N întrebări care să aibă între a şi b
întrebări, iar la fiecare chestionar trebuie să se totalizeze între p şi q puncte. Se cunoaşte punctajul fiecărei întrebări.
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)
return 0;
if (Numar_intrebari(k)<a)
return 0;
return 1;
}
void Tipar (int k)
{
cout << endl<< " { ";

34
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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 submulţimile de câte M elemente a unei mulţimi 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)
return 0;
return 1;
}
int Solutie (int k)
{
if (Numar_elemente(k)!=M)
return 0;
if (Suma_acumulata(k)<a)

35
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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
4 5 6
2
7 8
2
9 10

Problema 15
7

36
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

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

37
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de sâmbătă 5 ianuarie 2019

Colegiul Naţional de Informatică "Spiru Haret" Suceava

FIŞĂ DE LUCRU – clasa a XI-a


Laborator Backtracking

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:10234, 12034, 12043, 12304,
12340, 20134.
45. Să se genereze toate şirurile de n (n<=6) note muzicale din mulţimea {do, re, mi, fa, sol,
la, si}. Fiecare şir va fi afişat pe câte o linie în fişierul out.txt, notele în cadrul liniei fiind
separate prin câte un spaţiu. Acestea se pot repeta în cadrul unui şir.
46. PARTIŢIILE UNUI NUMĂR NATURAL. Se citeşte un număr natural N. Se cere să se
tipărească toate modurile de descompunere a sa ca sumă de numere naturale (Exemplu:
pentru numărul 4: 1111, 112, 121, 13, 211, …).
47. DESCOMPUNERE. Să se decompună un număr 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 număr natural N, se cere să
se afişeze toate descompunerile numărului 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.

38