Sunteți pe pagina 1din 23

Probleme

Tehnica Backtracking
Agheorghieisei Andreea Bianca clasa a XI a MI2
677. Fie n numar natural nenul. Sa se afiseze toate configuratiile elementelor multimii
A={1,2,3,...,n}.
#include<iostream.h>
#include<conio.h>
int x[100],i,n,k;
void citire()
{
cin>>n;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;

return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tip()
{
for(i=1;i<=n;i++)
cout<<x[i];
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{

x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

678. Se citesc de la tastatura n, numar natural nenul, si elementele unei multimi A care
memoreaza n numere intregi. Sa se afiseze toate configuratiile multimii A={a1,a2,....,an}.
#include<iostream.h>
#include<conio.h>
int x[100],v[100],n,i,k;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)

{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<v[x[i]];
cout<<endl;}
void bktk()
{

k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tiparire();
else
{
k++;
init(k); }}
else
k--;}}
int main ()

bktk();
getche();

citire();

679. Se citesc de la tastatura n numar natural nenul si numele a n copii. Sa se aranjeze in


toate metodele posibile numele copiilor in sir indian.
#include<iostream.h>
#include<math.h>
#include<conio.h>
int x[100],n,i,k;
char p[100][100];
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)

{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<p[x[i]]<<" ";
cout<<"\n";}
void bktk()
{
k=1;
init(k);

while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tiparire();
else
{
k++;
init(k); } }
else
k--; }}
int main ()
{
citire();
bktk();
getche();}

680. Se citesc de la tastatura n numar natural nenul si elementele unei multimi A care
memoreaza n numere intregi. Sa se afiseze toate configuratiile elementelor multimii
A={a1,a2,a3,...,an} care nu contin doua elemente alaturate cu aceeasi paritate.
#include<iostream.h>
#include<math.h>
#include<conio.h>
int x[100],n,i,k,p[100];
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>p[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)

for(i=1;i<k;i++)
if((x[i]==x[k])||
((p[x[k]]%2)==(p[x[k-1]]
%2)))
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<p[x[i]]<<" ";
cout<<"\n";}
void bktk()

k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tiparire();
else
{
k++;
init(k); }}
else
k--; }}
int main ()

{
citire();

bktk();
getche();}

681. Pe o tabla de sah de dimensiunea n*n se aseaza n ture. Sa se afiseze toate configuratiile
turelor pe tabla de sah astfel incat oricare 2 ture sa nu se atace.
#include<iostream.h>
#include<math.h>
#include<conio.h>
int x[100],n,i,k,a[100];
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{

for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<"("<<i<<";"<<x[i]
<<")"<<" ";
cout<<endl;}
void back()
{
k=1;
init(k);

while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tiparire();
else
{
k++;
init(k);}}
else
k--; }}
int main ()
{
citire();
back();
getche();}

682. Problema damelor. Pe o tabla de sah de dimensiune nxn se aseaza n dame. Sa se afiseze
toate configuratiile damelor pe tabla de sah astfel incat oricare doua dame sa nu se atace.
Solutiile se exprima prin coordonatele damelor pe tabla de sah. Doua dame se ataca atunci
cand se gasesc pe aceeasi linie, coloana sau diagonala.
#include<iostream.h>
#include<conio.h>
#include<math.h>
int x[100],n,i,k,j;
void citire()
{
cin>>n;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{

for(i=1;i<k;i++)
if(x[i]==x[k]||
abs(x[k]-x[i])==abs(k-i))
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tiparire()
{
for(i=1;i<=k;i++)
{
for(j=1;j<=k;j++)
if(x[i]==j)

cout<<"D";
else
cout<<"*";
cout<<endl;}
cout<<endl;}
void bktk()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tiparire();

else
{
k++;
init(k); }}

else
k--; }}
int main ()
{

citire();
bktk();
getche();}

683. Problema camilelor. n camile numerotate de la 1 la n sunt aranjate in sir indian. Sa se


rearanjeze camilele astfel incat fiecare camila sa aiba in fata o camila diferita de
configuratia initiala.
#include<iostream.h>
#include<conio.h>
int x[100],k,i,n;
void citire()
{
cin>>n;}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int cond()
{

for(i=1;i<n;i++)
if(x[i+1]-x[i]==1)
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tip()
{
for(i=1;i<=n;i++)
cout<<x[i]<<" ";
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{

x[k]=x[k]+1;
if(cont(k))
if(solutie(k)&&cond())
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

684. Se citeste un numar natural n cu cel mult 9 cifre. Sa se genereze toate numerele avand
aceleasi cifre ca n. Care este cel mai mare?
#include<iostream.h>
#include<conio.h>
int
a[100],v[100],x[100],n,i,j
=1,k,m=0,nr,max,aux,inv;
void citire()
{
cin>>n; aux=n;
inv=0;
while(n!=0)
{
inv=inv*10+n
%10;
n=n/10;}
while(inv!=0)

{
m++;
v[m]=inv%10;
inv=inv/10;}}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<m)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)

if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==m)
return 1;
return 0;}
int form(int k)
{
nr=0;
for(i=1;i<=k;i++)
nr=nr*10+v[x[i]];}
int cond()
{

for(i=1;i<=j;i++)
if(nr==a[i])
return 0;
return 1;}
void gener()
{
j++;
a[j]=nr;}
while(k>0)
{
if(exista(k))
{

void tip()
{
for(i=2;i<=j;i++)
cout<<a[i]<<" ";}
void maxim()
{
max=0;
for(i=1;i<=j;i++)
form(k);
if(cond())
gener();}

x[k]=x[k]+1;

else
{
k++;

if(cont(k))
if(solutie(k))
{

init(k);}}

if(max<a[i])
max=a[i];
cout<<max;}
void back()
{
k=1;
init(k);
a[1]=aux;
else
k--;}}
int main()
{
citire();
back();
tip();
cout<<endl;
maxim();
getche();
}

685. Anagrame I. Se citeste un cuvant de la tastatura. Cuvantul poate avea cel mult 8 litere.
Sa se afiseze toate anagramele acestui cuvant (cuvinte cu aceleasi litere dar in alta ordine).
#include<iostream.h>
#include<conio.h
#include<string.h>
#include<stdlib.h>
int k,i,x[100];
char a[8];
void citire()
{
cin>>a;}
int init(int k)
{
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{

x[k]=0;}
int exista(int k)
{
if(x[k]<strlen(a))
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
x[k]=x[k]
+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;

return 1;}
int solutie(int k)
{
if(k==strlen(a))
return 1;
return 0;}
void tip()
{
for(i=1;i<=strlen(a);i+
+)
cout<<a[x[i]-1];
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();}

686. Anagrame II. Se citeste un cuvant de la tastatura. Cuvantul poate avea cel mult 8 litere.
Sa se afiseze toate anagramele acestui cuvant (cuvinte cu aceleasi litere dar in alta ordine)
care nu contin mai mult de doua consoane alaturate.

#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int k,i,x[100];
char
a[8],v[]="aeiouAEIOU";
void citire()
{
cin>>a;}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<strlen(a))
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}

int solutie(int k)
{
if(k==strlen(a))
return 1;
return 0;}
int cond()
{
for(i=3;i<=strlen(a);i+
+)
if(strchr(v,a[x[i]1])==0&&strchr(v,a[x[i1]1])==0&&strchr(v,a[x[i2]-1])==0)
return 0;
return 1;}
void tip()
{
for(i=1;i<=strlen(a);i+
+)
cout<<a[x[i]-1];
cout<<endl;}
void back()
{

k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]
+1;
if(cont(k))
if(solutie(k)&&cond())
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();}

687. Conflicte. Se citesc numele a n persoane care sunt asezate la o masa rotunda. Intre
oricare doua persoane alaturate s-au iscat conflicte. Scrieti un program care sa afiseze toate
modurile posibile de reasezare a persoanelor astfel incat sa nu se gaseasca alaturi doua
persoane in conflict.
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
char a[10][10];
int x[100],k,i,n;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)

return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tip()
{
for(i=1;i<=n;i++)
cout<<a[x[i]]<<" ";
cout<<endl;}

int cond()
{
for(i=2;i<=n;i++)
if(abs(x[i]-x[i-1])==1||
abs(x[i]-x[i-1])==n-1)
return 0;
return 1;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))

if(solutie(k)&&cond())
tip();
else
{
k++;

citire();
back();
getche();

init(k);}}
else
k--;}}
int main()
{

688. Sunt 2*n copii de inaltimi diferite. Pentru fiecare copil sa citeste inaltimea acestuia. Sa
se aseze copiii pe 2 randuri astfel:
-pe ambele randuri copiii sa fie asezati in ordinea crescatoare a inaltimii
-copiii de pe al doilea rand sa fie mai inalti decat cei din fata lor.
#include<iostream.h>
#include<conio.h>
int x[100],n,i,k,v[100];
void citire()
{
cin>>n;
for(i=1;i<=2*n;i++)
cin>>v[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<2*n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i] || v[x[k1]]>=v[x[k]] || v[x[k1+n]]>=v[x[k+n]] ||

v[x[k-1]]>=v[x[k+n]] ||
v[x[n]]>=v[x[2*n]])
return 0;
return 1;}
int solutie(int k)
{
if(k==2*n)
return 1;
return 0;}
void tip()
{
for(i=1;i<=n;i++)
cout<<v[x[i]]<<" ";
cout<<endl;
for(i=n+1;i<=2*n;i++)
cout<<v[x[i]]<<" ";
cout<<endl;
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)

{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

691. Fie o matrice cu nxn componente. Sa se determine cea mai mare suma care se poate
obtine insumand n valori luate din linii si coloane diferite.
#include<iostream.h>
#include<conio.h>
int a[10]
[10],x[100],k,i,n,j,max=0,
s;
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)

cin>>a[i][j];}
int init(int k,int x[])
{
x[k]=0;}
int exista(int k,int x[])
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k,int x[])

{
for(i=1;i<k;i++)
if(x[k]==x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}

void suma()
{
s=0;
for(i=1;i<=n;i++)
s=s+a[i][x[i]];}
void maxim()
{
if(max<s)
max=s;}
void back()
{
k=1;
init(k,x);
while(k>0)

else
{
k++;

if(exista(k,x))
{
x[k]=x[k]+1;
if(cont(k,x))
if(solutie(k))
{
suma();
maxim();}

init(k,x);}}
else
k--;}}
int main()
{
citire();
back();
cout<<max;
getche();
}

692. Se citesc 2n numere intregi. Sa se genereze configuratia: x1x2+x3x4+...+x(2n-1)x2n cu


valoare maxima.
#include<iostream.h>
#include<conio.h>
int
n,x[100],v[100],max=0,k,
s,i;
void citire()
{
cin>>n;
for(i=1;i<=2*n;i++)
cin>>v[i];}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i])
return 0;

return 1;}
int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void maxim(int s)
{
if(max<s)
max=s;}
int suma()
{
s=0;
for(i=1;i<=n;i++)
s=s+v[2*x[i]1]*v[2*x[i]];
return s;}
void back()
{
k=1;
init(k);
while(k>0)
{

if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
maxim(suma());
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
cout<<max;
getche();
}

693. Se citesc coordonatele carteziene a n puncte. Sa se afiseze o configuratie a celor n


puncte a caror ordine sa determine linia franta cu lungimea cea mai mare.
#include<iostream.h>
#include<conio.h>
#include<math.h>
int a[100],k,i,n;
float s,max=0;

struct punct
{
float x,y;};
punct v[100],b[100];
void citire()

{
cin>>n;
for(i=1;i<=n;i++)
{

cout<<"x"<<i<<"=";
cin>>v[i].x;
cout<<"y"<<i<<"=";
cin>>v[i].y;
cout<<endl;}}
void init(int k)
{
a[k]=0;}
int exista(int k)
{
if(a[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(a[i]==a[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==n);}
float linie()

{
s=0;
for(i=1;i<n;i++)
s=s+sqrt((v[a[i]].xv[a[i+1]].x)*(v[a[i]].xv[a[i+1]].x)+(v[a[i]].yv[a[i+1]].y)*(v[a[i]].yv[a[i+1]].y));
return s;}
void maxim(float s)
{
if(max<s)
{
max=s;
for(i=1;i<=n;i++)
b[i]=v[a[i]];}}
void tip()
{
cout<<"max=
"<<max<<endl;
for(i=1;i<=n;i++)
cout<<b[i].x<<"
"<<b[i].y<<endl;}
void back()
{
k=1;

init(k);
while(k>0)
if(exista(k))
{
a[k]=a[k]+1;
if(cont(k))
if(solutie(k))
maxim(linie());
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
tip();
getche();
}

694. Fie n si m numere naturale nenule. Sa se afiseze toate configuratiile formate din m
elemente ale multimii A={1,2,3,...,n}.
#include<iostream.h>
#include<conio.h>
int x[100],k,i,n,m;
void citire()
{
cin>>n>>m;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])

return 0;
return 1;}
int solutie(int k)
{
if(k==m)
return 1;
return 0;}
int tip()
{
for(i=1;i<=m;i++)
cout<<x[i]<<" ";
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
if(exista(k))

{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
getche();}

695. Se citesc de la tastatura n si m, numere naturale nenule si elementele multimii A care


memoreaza n numere intregi. Sa se afiseze toate configuratiile formate din m elemente ale
multimii A={a1,a2,a3,...,an}.
#include<iostream.h>
#include<conio.h>
int x[100],v[100],n,i,k,m;
void citire()
{
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>v[i];}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)

if(x[i]==x[k])
return 0;
return 1;}
int solutie(int k)
{
if(k==m)
return 1;
return 0;}
void tip()
{
for(i=1;i<=m;i++)
cout<<v[x[i]]<<" ";
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
if(exista(k))

{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
getche();
}

696. Scrieti un program care sa afiseze toate numerele de n cifre formate din cifre distincte si
care sunt divizibile cu 4.
#include<iostream.h>
#include<conio.h>
int x[100],i,k,n;
void citire()
{
cin>>n;}
int init(int k)
{
x[k]=-1;}
int exista(int k)
{
if(x[k]<9)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i])

return 0;
return 1;}
int solutie(int k)
{
if(k==n&&(x[n1]*10+x[n])
%4==0&&x[1]!=0)
return 1;
return 0;}
void tip()
{
for(i=1;i<=n;i++)
cout<<x[i];
cout<<endl;}
void back()
{
k=1;
init(k);

while(k>0)
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
getche();

}
697. Fiind data o multime de n cuburi, fiecare cub fiind caracterizat de lungmea laturii si
culoarea sa, sa se scrie un program care sa genereze toate turnurile care se pot forma cu p
culori astfel incat doua cuburi vecine sa nu aiba aceeasi culoare iar deasupra unui cub sa nu
se poata aseza un cub cu latura mai mare.
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
int x[100],k,n,i,p;
struct cub
{
char cul[10];
float l;};
cub v[100];
void citire()
{
cin>>n>>p;
for(i=1;i<=n;i++)
{
cout<<"cul"<<i<<":";
cin>>v[i].cul;
cout<<"lungime"<<i<<"=
"; cin>>v[i].l;
cout<<endl;}}
int init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<p)

return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[i]==x[k])
return 0;
return 1;}
int cond()
{
for(i=1;i<n;i++)
if(strcmp(v[x[i]].cul,v[x[i
+1]].cul)==0||
v[x[i]].l<v[x[i+1]].l)
return 0;
return 1;}
int solutie(int k)
{
if(k==p)
return 1;
return 0;}
void tip()
{
for(i=p;i>=1;i--)
{

cout<<endl;}
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k)&&cond())
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
getche();
}

cout<<v[x[i]].l<<"
"<<v[x[i]].cul;

698. Se citeste un numar x de la tatatura. Sa se genereze cel mai mare numar care se obtine
din x daca se elimina n cifre din x.
#include<iostream.h>
#include<conio.h>
int
max=0,m=0,n,i,k,v[100],x
[100],a,nr;
void citire()
{
cin>>a>>n;
while(a!=0)
{

m++;
v[m]=a%10;
a=a/10;}}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<m)
return 1;

return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==m-n)

return 1;
return 0;}
void maxim()
{
nr=0;
for(i=1;i<=m-n;i++)
nr=nr*10+v[x[i]];
if(max<nr)
max=nr;}
void back()
{
k=1;

init(k);
while(k>0)
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
maxim();
else
{
k++;
init(k);}}

else
k--;}
int main()
{
citire();
back();
cout<<max;
getche();
}

699. Problema drapelelor. Se citesc n culori (siruri cu maxim 15 caractere) de la tastatura. Sa


se genereze toate steagurile din 3 culori distincte care pot avea la mijloc doar prima sau
ultima culoare.
#include<iostream.h>
if(x[k]==x[i])
k=1;
#include<conio.h>
return 0;
init(k);
#include<string.h>
return 1;}
while(k>0)
#include<stdlib.h>
int solutie(int k)
if(exista(k))
char a[100][15];
{
{
int x[100],k,i,n;
if(k==3)
x[k]=x[k]+1;
void citire()
for(i=1;i<3;i++)
if(cont(k))
{
if(strcmp(a[x[i]],a[x[i+1]]
if(solutie(k))
cin>>n;
)!
tip();
for(i=1;i<=n;i++)
=0&&strcmp(a[x[2]],a[1]
else
cin>>a[i];}
)==0&&strcmp(a[x[2]],a[
{
void init(int k)
n])==0)
k++;
{
return 1;
init(k);}}
x[k]=0;}
else
else
int exista(int k)
return 0;}
k--;}
{
void tip()
int main()
if(x[k]<n)
{
{
return 1;
for(i=1;i<=3;i++)
citire();
return 0;}
cout<<a[x[i]]<<" ";
back();
int cont(int k)
cout<<endl;}
getche();}
{
void back()
for(i=1;i<k;i++)
{
700. Se citesc n cuvinte de la tastatura unde pentru fiecare cuvant se citeste si tipul acestuia
exprimat printr-un caracter: s pentru substantiv, v pentru un verb, a pentru un adjectiv sau
adverb. Sa se genereze toate propozitiile formate din trei cuvinte, cate unul din fiecare
categorie.
#include<iostream.h>
#include<conio.h>
int x[100],k,i,n;
struct cuvant
{
char cuv[100],t[2];};

cuvant v[100];
void citire()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>v[i].cuv>>v[i].t;}

void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)

return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==3)
return 1;
return 0;}
int cond()
{ for(i=1;i<n;i++)

if(strcmp(v[x[i]].t,v[x[i+1
]].t)==0)
return 0;
return 1;}
void tip()
{
for(i=1;i<=3;i++)
cout<<v[x[i]].cuv<<"
";
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
if(exista(k))

{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k)&&cond())
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{ citire();
back();
getche();}

701. Se citesc n cuvinte de la tastatura, unde fiecare cuvant poate fi un sir de caractere cu cel
mult 15 litere mici ale alfabetului englez. Sa se afiseze toate sirurile formate din p cuvinte
pentru care fiecare cuvant incepe cu o litera identica cu ultima litera a cuvantului precedent.
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
char a[10][10];
int i,k,x[100],n,p;
void citire()
{
cin>>n>>p;
for(i=1;i<=n;i++)
cin>>a[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{

for(i=1;i<k;i++)
if(x[k]==x[i]||a[x[k-1]]
[strlen(a[x[k-1]])-1]!
=a[x[k]][0])
return 0;
return 1;}
int solutie(int k)
{
if(k==p)
return 1;
return 0;}
void tip()
{
for(i=1;i<=p;i++)
cout<<a[x[i]]<<" ";
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)

if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}
int main()
{
citire();
back();
getche();}

702. Fie n si m numere naturale nenule. Sa se afiseze toate submultimile formate din m
elemente ale multimii A={1,2,...,n}.

#include<iostream.h>
#include<conio.h>
int x[100],i,n,k,p;
void citire()
{
cin>>n>>p;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i])
return 0;

return 1;}
int solutie(int k)
{
if(k==p)
return 1;
return 0;}
void tip()
{
for(i=1;i<=p;i++)
cout<<x[i];
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{

x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

703. Se citesc de la tastatura n si m, numere naturale nenule si elementele unei multimi A care
memoreaza n numere intregi. Sa se afiseze toate submultimile formate din m elemente ale
multimii A={a1,a2,...,an}.
#include<iostream.h>
#include<conio.h>
int x[100],i,n,k,m,v[100];
void citire()
{
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>v[i];}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i])
return 0;

return 1;}
int solutie(int k)
{
if(k==m)
return 1;
return 0;}
void tip()
{
for(i=1;i<=m;i++)
cout<<v[x[i]];
cout<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;

if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

704. Se citesc numele si sexul a n persoane. Sa se afiseze toate modurile in care se pot forma
un grup de p persoane din grup, unde fiecare grup va contine cel putin o femeie si cel putin
un barbat.
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
struct copii
{
char nume[100];
int sex;};
copii v[100];
int x[100],i,k,n,p;
void citire()
{
cin>>n>>p;
for(i=1;i<=n;i++)
cin>>v[i].nume>>v[i].sex
;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;

return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==p)
for(i=1;i<p;i++)
if(v[x[i]].sex!
=v[x[i+1]].sex)
return 1;
return 0;}
void tip()
{
for(i=1;i<=p;i++)
cout<<v[x[i]].nume<<" ";
cout<<endl;}
void back()
{
k=1;

init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();}

705. Optimizare expresie. Fie doua multimi de numere intregi A cu m elemente si B cu n


elemente. Sa se determine valoarea tuturor expresiilor suma de la i=1 pana l m din a[i] si
b[j] care includ toate elementele din A si o parte din elementele din B. Sa se afiseze expresia
cu valoare maxima.
#include<iostream.h>
#include<conio.h>
int
x[100],i,n,k,m,a[100],b[1
00],max=0,s;
void citire()
{
cin>>m;
for(i=1;i<=m;i++)
cin>>a[i];
cin>>n;
for(i=1;i<=n;i++)
cin>>b[i];}
void init(int k)
{

x[k]=0;}
int exista(int k)
{
if(x[k]<n)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]==x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==m)

return 1;
return 0;}
void maxim()
{
s=0;
for(i=1;i<=m;i++)
s=s+a[i]*b[x[i]];
cout<<s<<endl;
if(max<s)
max=s;}
void back()
{
k=1;
init(k);
while(k>0)

{
if(exista(k))
{

maxim();
else
{
k++;

x[k]=x[k]+1;
if(cont(k))
if(solutie(k))

init(k);}}
else

k--;}}
int main()
{
citire();
back();
cout<<"max= "<<max;
getche();}

706. Sa se genereze toate numerele formate din n cifre ordonate strict crescator.
#include<iostream.h>
#include<conio.h>
int x[100],i,n,k,nr;
void citire()
{
cin>>n;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<9)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i])
return 0;
return 1;}

int solutie(int k)
{
if(k==n)
return 1;
return 0;}
void tip()
{
nr=0;
for(i=1;i<=n;i++)
nr=nr*10+x[i];
cout<<nr<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{

x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

707. Sa se genereze toate numerele formate din n cifre ordonate strict crescator pentru care
prima cifra este p.
#include<iostream.h>
#include<conio.h>
int x[100],i,n,k,nr,p;
void citire()
{
cin>>n>>p;}
void init(int k)
{
x[k]=0;}
int exista(int k)
{
if(x[k]<9)
return 1;
return 0;}

int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i])
return 0;
return 1;}
int solutie(int k)
{
if(k==n-1)
return 1;
return 0;}
void tip()
{
nr=p;

for(i=1;i<n;i++)
nr=nr*10+x[i];
cout<<nr<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))

if(solutie(k))

citire();
back();
getche();

init(k);}}
tip();
else
{
k++;

else
k--;}}
int main()
{

708. Sa se genereze toate numerele formate din n cifre ordonate strict crescator pentru care
prima si ultima cifra sunt p1 respectiv p2.
#include<iostream.h>
#include<conio.h>
int x[100],i,n,k,nr,p1,p2;
void citire()
{
cin>>n>>p1>>p2;}
void init(int k)
{
x[k]=p1;}
int exista(int k)
{
if(x[k]<9)
return 1;
return 0;}
int cont(int k)
{
for(i=1;i<k;i++)
if(x[k]<=x[i]||x[k]>=p2)
return 0;
return 1;}
int solutie(int k)
{
if(k==n-2)
return 1;
return 0;}
void tip()
{
nr=p1;
for(i=1;i<n-1;i++)
nr=nr*10+x[i];
nr=nr*10+p2;
cout<<nr<<endl;}
void back()
{
k=1;
init(k);
while(k>0)
{
if(exista(k))

{
x[k]=x[k]+1;
if(cont(k))
if(solutie(k))
tip();
else
{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();
}

709. Fie n numar natural nenul(n<=10). Sa se afiseze toate submultimile multimii


A={1,2,3,..}.
#include<conio.h>
#include<iostream.h>
int x[100], i, n,k;
int exista(int k)
{ if(x[k]<n)
return 1;
return 0;
}
void tiparire(int k)
{ for(i=1;i<=k;i++)
cout<<x[i]<<" ";

cout<<endl;
}
void bkkt()
{ k=1;
x[k]=0;
while(k>0)
{ if(exista(k))
{ x[k]=x[k]+1;
tiparire(k);
if(k<n)
{ k++;

x[k]=x[k-1];
}}
else
k--;
}
}
int main()
{ cin>>n;
bkkt();
getche();
}

710. Se citesc de la tastatura n, numar natural nenul, si elementele unei multimi a ce


memoreaza n numere intregi. Sa se afiseze toate submultimile multimii A={ a1,a2,...an}.
#include<conio.h>
void tiparire(int k)
if(k<n)
#include<iostream.h>
{ for(i=1;i<=k;i++)
{ k++;
int x[100], i, n,k,v[100];
cout<<v[x[i]]<<" ";
x[k]=x[k-1];
void citire()
cout<<endl;
}}
{ cin>>n;
}
else
for(i=1;i<=n;i++)
k--;
cin<<v[i];}
void bkkt()
}
int exista(int k)
{ k=1;
}
{ if(x[k]<n)
x[k]=0;
int main()
return 1;
while(k>0)
{ citire();
return 0;
{ if(exista(k))
bkkt();
}
{ x[k]=x[k]+1;
getche();
tiparire(k);
}
711. Porturi. Pe o mare exista n porturi. Se cunosc denumirile porturilor si costul stationarii
pentru fiecare port. Sa se afiseze toate posibilitatile de a stationa in porturi astfel incat sa nu se
treaca printr-un port de mai multe ori si costul total sa se incadreze intr-un interval dat: [si,s2].
Sa se afiseze solutia cu cele mai multe stationari.
#include<conio.h>
#include<iostream.h>
struct porturi
{ char nume[100];
float pret;};
porturi v[100];

int x[100],m,i,k,p=0,a[100],b[100], s1,s2,c[100][100],max=0,max1=0,o,n;


void citire()
{ cin>>n;
for(i=1;i<=n;i++)
{ cin>>v[i].nume;
cin<<v[i].pret;
}
}
int exista(int k)
{ if(x[k]<n)
return 1;
return 0;
}
void calcul(int k)
{ int s=0;
for(i=1;i<=k;i++)
s=s+v[x[i]].pret;
if(s1<=s && s2>=s)
{ p++;
a[p]=s;
b[p]=k;
for(i=1;i<=k;i++)
c[p][i]=x[i];}
if(max<=a[p])
if(max1<b[p])
{ max=a[p];
max1=b[p];
o=p;}}}
void back()
{ k=1;
x[k]=0;
while(k>0)
if(exista(k))
{ x[k]=x[k]+1;
calcul(k);
if(k<n)
{ k++;
x[k]=x[k-1];}}
else
k--;
}}
void coparare()
{ for(i=1;i<=b[o];i++)
cout<<v[c[o][i]].nume<<" ";}
int main()
{ citire();
cin>>s1>s2;
back();
compare();
getche();}

712. Subsir crescator. Se citesc n numere intregi. Sa se afisez un subsir crescator de valori nu
obligatoriu consecutive care pastreaza ordinea initiala avand lungima maxima. In cazul in care
exista mai multe solutii sa se afiseze numarul acestora.
#include<conio.h>
return 1;
}
#include<iostream.h>
}
if(k<p)
int
int solutie (int k)
{ k++;
x[100],i,n,k,p,q=0,v[100];
{ if(k==p)
x[k]=x[k-1];}}
void citire()
return 1;
else
{ cin>>n;
return 0;
k--;
for(i=1;i<=n;i++)
}
}
cin>>v[i];
void back()
}
}
{ k=1;
int main()
int exista (int k)
x[k]=0;
{ citire();
{ if(x[k]<n)
while(k>0)
for(p=n;p>=0&&
return 1;
{ if(exista(k))
q==0;p--)
return 0;}
{ x[k]=x[k]+1;
back();
int cond(int k)
if(solutie(k) && cond (k))
getche();
{
{ q=1;
}
for(i=1;i<k;i++)
for(i=1;i<=p;i++)
if(v[x[i]]>v[x[i+1]])
cout<<v[x[i]]<<" ";
return 0;
cout<<endl;
713. Se citeste un numar natural n avand cel mult 10 cifre. Sa se afiseze cel mai mare numar
care se obtine eliminand p cifre si pastrand ordinea initiala a cifrelor.
#include<conio.h>
int exista (int k)
{ int u=1;
#include<iostream.h>
{ if(x[k]<q)
for(i=1;i<=k;i++)
int
x[100],
return 1;
{ s[l]=s[l]+b[x[i]]*u;
b[100],n,i,k,max=0,p,q=0,
return 0;
u=u*10;}
l=1,s[100];
}
l++;
void citire()
int solutie(int k)
}
{ cin>>n>>p;
{ if(k==q-p)
void bkkt()
while(n!=0)
return 1;
{ k=1;
{ q++;
return 0;
x[k]=0;
b[q]=n%10;
}
while(k>0)
n=n/10;}}
void tiparire()
{ if(exista(k))

{ x[k]=x[k]+1;
if(solutie(k))
tiparire();
if(k<q)
{ k++;
x[k]=x[k-1];
}
}
else

k--;
}
}
void smax()
{ int max=0;
for(i=1;i<=l;i++)
if(max<s[i])
max=s[i];
cout<<max;

}
int main()
{ citire();
bkkt();
smax();
getche();
}

714. Se citeste un numar natural n avand cel mult 10 cifre. Sa se afiseze cel mai mare numar
care se obtine eliminand p cifre si patrand ordinea initiala a cifrelor.
#include<iostream.h>
#include<conio.h>
#include<math.h>
int
x[100],i,p=1,k,j,a[100];
void citire()
{
for(i=1;i<=5;i++)
{
a[i]=p;
p=p+2;
}
}
int exista(int k)
{
if(x[k]<5)
return 1;
return 0;
}
int cont(int k)
{
for(i=1;i<k;i++)

if(x[i]>=x[k]
a[x[i]]<=a[x[k]] )
return 0;
return 1;
}
int solutie(int k)
{
if(k==j)
return 1;
return 0;
}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<a[x[i]];
cout<<endl;
}
void back()
{
k=1;
x[k]=0;
while(k>0)

&&

{
if(exista(k))
{
x[k]=x[k]+1;
if(cont(k))
{if(solutie(k))
tiparire();
else
{
k++;
x[k]=0;
}}}
else;
k--;
}}
int main()
{
citire();
for(j=1;j<=5;j++)
back();
getche();
}

715. Fie n si m numere naturale neule. Sa se afiseze toate elementele produsului cartezian.
#include<iostream.h>
}
{
#include<conio.h>
void init(int k)
if(x[k]<n)
int x[100],i,n,k,p[100],m;
{
return 1;
void citire()
x[k]=0;
return 0;
{
}
}
cin>>n>>m;
int exista(int k)
int solutie(int k)

{
if(k==m)
return 1;
return 0;

}
void tiparire()
{
for(i=1;i<=k;i++)
cout<<x[i]<<" ";
cout<<endl;}
void back()

k=1;
init(k);
while(k>0)
{
if(exista(k))
{
x[k]=x[k]+1;
if(solutie(k))
tiparire();
else

{
k++;
init(k);}}
else
k--;}}
int main()
{
citire();
back();
getche();}

716. Se citesc de la tastatura n si m numere naturale nenule si elementele unei multimi A, care
memoreaza n numere intregi . Sa se afiseze produsul cartezian.
#include<iostream.h>
}
if(exista(k))
#include<conio.h>
int solutie(int k)
{
int x[100],i,n,k,p[100],m;
{
x[k]=x[k]+1;
void citire()
if(k==m)
if(solutie(k))
{
return 1;
tiparire();
cin>>n>>m;
return 0;
else
for(i=1;i<=n;i++)
}
{k++;
cin>>v[i];
void tiparire()
init(k);}}
}
{
else
void init(int k)
for(i=1;i<=k;i++)
k--;}}
{
cout<<v[x[i]]<<" ";
int main()
x[k]=0;
cout<<endl;}
{
}
void back()
citire();
int exista(int k)
{
back();
{
k=1;
getche();}
if(x[k]<n)
init(k);
return 1;
while(k>0)
return 0;
{
717. Sa se genereze produsul cartezian a n multimi. Pentru fiecare multime se cunoaste
numarul de elemente . Fiecare multime ai contine pi elemente , respectiv valorile de la 1, 2
...la pi.
#include<conio.h>
for(i=1;i<=n;i++)
int exista(int k)
#include<iostream.h>
{ cin<<v[i];
{ if(x[k]<n)
int x[100], i, n,k, a[10]
for(j=1;j<=v[i];j++)
return 1;
[10], v[100],j;
cin>>a[i][j];
return 0;
void citire()
}}
}
{ cin>>n;
int solutie(int k)

{ if(k==n)
return 1;
return 0;
}
void tiparire(int k)
{ for(i=1;i<=k;i++)
cout<<a[i][x[i]]<<" ";
cout<<endl;
}
void bkkt()

{ k=1;
x[k]=0;
while(k>0)
{ if(exista(k))
{ x[k]=x[k]+1;
if(solutie(k))
tiparire(k);
else
{ k++;
x[k]=x[k-1];
}}

else
k--;
}
}
int main()
{ cin>>n;
bkkt();
getche();
}

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