Documente Academic
Documente Profesional
Documente Cultură
BACKTRACKING. PROBLEME
1
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
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.
2
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
3
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
4
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
}
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 marţi 20 noiembrie 2018
{
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
}
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
}
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
{
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 marţi 20 noiembrie 2018
{
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
20
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
21
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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.
23
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
}
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);
}
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
}
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 marţi 20 noiembrie 2018
{
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 marţi 20 noiembrie 2018
28
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
}
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
}
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;
}
}
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
35
INFORMATICĂ / LABORATOR Clasa a XI-a Lectia de marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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 marţi 20 noiembrie 2018
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