Documente Academic
Documente Profesional
Documente Cultură
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();
{
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();}
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();
}
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();
}
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();}
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();
}
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();}
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();
}
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();
}
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();
}