You are on page 1of 30

Metoda Backtracking

Problema 1
Problema permutarilor primelor n numere .
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,nr,X;
void citire()
{f>>n;
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void afis()
{for(i=1;i<=n;i++)g<<x[i]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu:n=3
123
132
213
231
312
321

Problema 2
Problema aranjamentelor de n luate cate m, m<=n.
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,m;
void citire()
{f>>n>>m;
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void afis()
{for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu:n=4, m=3;
123
124
132
134
142
143
213
214
231
234
241

243
312
314
3

21

Problema 3
Problema combinarilor de n luate cate m. m<=n;

#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,m;
void citire()
{f>>n>>m;
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]>x[k])return 0;
return 1;
}
void afis()
{for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(1+x[k]<n-m+k){x[k]++;
if(cont(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu:n=5,m=3
111
112
113
114
122
123
124

133
134
222
223
Problema 4
Permutari , aranjamente, combinari de numere.
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,m;
void citire()
{f>>n>>m;}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;}
void afis()
{for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';}
void backpermutari()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;}
while(k>0);}
void backaranjamente()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;}
while(k>0);}
int cont1(int k)
{for(i=1;i<k;i++)if(x[i]>x[k])return 0;
return 1;}
void backcombinari()
{k=1;x[k]=0;
do{while(1+x[k]<=n-m+k){x[k]++;
if(cont1(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;}
while(k>0);}
int main()

{citire();
g<<"Permutari de "<<n<<'\n';backpermutari();
g<<"Aranjamente de "<<n<<" luate cate "<<m<<'\n';backaranjamente();
g<<"Combinari de "<<n<<" luate cate "<<m<<'\n';backcombinari();
f.close();g.close();return 0;}

Problema 5
Se citesc n numere. Sa se genereze toate secventele din exact m dintre ele (m<n) astfel incat
secventele sa contina numere distincte si doua numere alaturate sa nu aiba aceeasi paritate.
Daca nu exista solutii se va afisa un mesaj;
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,m,v[100],aux;
void citire()
{f>>n>>m;
for(i=1;i<=n;i++)f>>v[i];
}
int cont1()
{for(i=1;i<m;i++)if((v[x[i]]%2==0&&v[x[i+1]]%2==0)||(v[x[i]]%2==1&&v[x[i+1]]%2==1))return 0;
return 1;
}
int cont(int k)
{for(i=1;i<k;i++)if(v[x[i]]==v[x[k]])return 0;
return 1;
}
void afis()
{if(cont1()){for(i=1;i<=k;i++)g<<v[x[i]]<<' ';
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}

Problema 6

Problema turelor
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,k,x[100],j,i,nr;
void citire()
{f>>n;
}
void afis()
{nr++;g<<"solutia "<<nr<<'\n';
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)if(x[i]==j)g<<'T';
else g<<'*';
g<<'\n';}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]++;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();g<<"Sunt "<<nr<<" solutii";
f.close();g.close();return 0;
}

Problema 7
Problema damelor
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,nr,x[100],k,i,j;
void citire()
{f>>n;}
void afis()
{if(nr>=10)g<<"Solutia cu numarul "<<nr<<": ";else g<<"Solutia cu numarul "<<nr<<": ";
for(i=1;i<=n;i++)g<<x[i]<<' ';
g<<'\n';
}
int cont(int k)
{for(j=1;j<k;j++)
if(abs(x[k]-x[j])==abs(k-j)||x[k]==x[j])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n){nr++;afis();}
else{k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
g<<"Sunt "<<nr<<" solutii";
f.close();g.close();return 0;
}

Problema 8
N camile sunt 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<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,v[100];
void citire()
{f>>n;
for(i=1;i<=n;i++)f>>v[i];
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
int cont1()
{for(i=2;i<=n;i++)if(v[x[i]-1]==v[i-1])return 0;
return 1;
}
void afis()
{if(cont1()){for(i=1;i<=n;i++)g<<v[x[i]]<<' ';
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu: n=8 si camilele: 1,2,3,4,5,6,7,8
13254786
13254867
13256487

13256784
13256847
13257486
13257846
Problema 9

1. Sa se genereze produsul cartezian a n multimi. Pentru fiecare multime se


cunoaste numarul de elemente. Daca o multime a p elemente atunci va contine
valorile de la 1,2 la p.
Ex n=3, p1=2, p2=3, p3=3 p4=4 Atunci:
{1,2} x {1,2,3} x {1,2,3}x{1,2,3,4}=
(1 1 1 1 ) (1 1 1 2 ) (1 1 1 3 ) (1 1 1 4 ) (1 1 2 1 ) (1 1 2 2 ) (1 1 2 3 ) (11 2 4 ) (1 1 3 1 )(1 1 3 2 )
(1 1 3 3 ) (1 1 3 4 )
(1 2 1 1 ) (1 2 1 2 ) (1 2 1 3 ) (1 2 1 4 ) (1 2 2 1 ) (1 2 2 2 ) (1 2 2 3 ) (1 2 2 4 ) (1 2 3 1 ) (1 2 3 2)
(1 2 3 3 ) (1 2 3 4 )
(1 3 1 1 ) (1 3 1 2 ) (1 3 1 3 ) (1 3 1 4 ) (1 3 2 1 ) (1 3 2 2 ) (1 3 2 3 ) (1 3 2 4 ) (1 3 3 1 ) (1 3 3 2 )
(1 3 3 3 ) (1 3 3 4 )
(2 1 1 1 ) (2 1 1 2 ) (2 1 1 3 ) (2 1 1 4 ) (2 1 2 1 ) (2 1 2 2 ) (2 1 2 3 ) (2 1 24 ) (2 1 3 1 ) (2 1 3 2 )
(2 1 3 3 ) (2 1 3 4 )
(2 2 1 1 ) (2 2 1 2 ) (2 2 1 3 ) (2 2 1 4 ) (2 2 2 1 ) (2 2 2 2 ) (2 2 2 3 ) (2 2 2 4 ) (2 2 3 1 ) (2 2 3 2 )
(2 2 3 3 ) (2 2 3 4 )
(2 3 1 1 ) (2 3 1 2 ) (2 3 1 3 ) (2 3 1 4 ) (2 3 2 1 ) (2 32 2 ) (2 3 2 3 ) (2 3 2 4 ) (2 3 3 1 ) (2 3 3 2 )
(2 3 3 3 ) (2 3 3 4 )
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,p[100];
void citire()
{f>>n;
for(i=1;i<=n;i++)f>>p[i];
}
void afis()
{for(i=1;i<=n;i++)g<<x[i]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]<p[k]){x[k]++;
if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}

int main()
{citire();back();
f.close();g.close();return 0;
}
Problema 10

N copii se aseaza in sir indian. Se cunosc numele celor n copii. Sa se gaseasca toate
posibilitatile de aranjare in sir.
#include<fstream.h>
#include<iostream.h>
#include<string.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i;
char p[100][20];
void citire()
{f>>n;
for(i=1;i<=n;i++){f.get();f.get(p[i],20);}
}
void afis()
{for(i=1;i<=n;i++)g<<p[x[i]]<<' ';
g<<'\n';
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu:n=4, nicu, maria, ioana, alex
nicu maria ioana alex
nicu maria alex ioana
nicu ioana maria alex
nicu ioana alex maria
nicu alex maria ioana
nicu alex ioana maria

maria nicu ioana alex


maria nicu alex ioana
etc.
Problema 11
Gigel are n cartonase (n<=10). Pe fiecare este scrisa o cifra de la 1 la 9. Uilizand doua tipuri de
cartonase cu + si - vrea sa obtina rezultatul 2. Care sunt solutiile pentru n citit?
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,x[100],k,i,s,nr,v[100];
void citire()
{f>>n;
for(i=1;i<=n;i++)f>>v[i];
}
int cont(int k)
{s=0;
for(i=1;i<=k;i++)if(x[i]%2==1)s=s+v[x[i]];
else s=s-v[x[i]];
if(s==2)return 1;
else return 0;
}
void afis()
{if(cont(k))
{s=0;
for(i=1;i<=k;i++)g<<v[x[i]]<<' ';
nr++;
g<<'\n';}
}
int cont1(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;return 1;}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(k==2)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
if(nr==0)g<<"nu exista solutii";f.close();g.close();return 0;
}
Exemplu:n=7 si 2 5 7 9 4 1 3
57

75
13
3

1 etc

Problema 12
Sa se genereze n perechi de paranteze care se inchid corect. Exemplu:
n=3: ( ( ( ) ) ) ( ( ) ( ) ) ( ) ( ( ) ) etc .
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,x[100],k,i,d[100];
void citire()
{f>>n;
}
void afis()
{for(i=1;i<=n;i++)
if(x[i]==1)g<<'(';
else g<<')';
g<<'\n';
}
void back()
{k=1;x[k]=-3;
do{while(x[k]<0){x[k]+=2;d[k]=d[k-1]+x[k];
if(0<=d[k]&&d[k]<=n-k)
if(k==n)afis();
else {k++;x[k]=-3;}
}
k--;
}
while(k>0);
}
int main()
{citire();
if(n%2!=0)g<<"Nu sunt solutii";
else {d[0]=0;back();}
f.close();g.close();return 0;
}
Exemplu:n=6
()()()
()(())
(())()
(()())
((()))

Problema 13
Se cer toate solutiile de asezare in linie a m caini si n pisici astfel incat sa nu existe o pisica intre
doi caini
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,m,n1,n2;
void citire()
{f>>m>>n;
}
int cont(int k)
{for(i=1;i<k-;i++)if(x[i]==1&&x[i+1]==2&&x[i+2]==1)return 0;
return 1;
}
int cont1(int k)
{for(i=1;i<=k;i++)if(x[i]==1)n1++;else n2++;
if(n1==m&&n2==n)return 1;
else return 0;
}
void afis()
{if(cont1(k)){for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<2){x[k]++;
if(cont(k))if(k==m+n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}

Problema 14

Sa se genereze toate numerele palindrome de lungime n


#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,nr,X;
void citire()
{f>>n;
}
int cont(int k)
{for(i=1;i<=k/2;i++)if(x[i]!=x[n-i+1])return 0;
return 1;
}
void afis()
{if(cont(k)){for(i=1;i<=n;i++)g<<x[i];
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<9){x[k]++;
if(k==n)afis();
else {k++;x[k]=-1;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}

Problema 15

Sa se genereze toate partitiile unui numar (sa se descompuna in suma de numere). Ex:
n=4 Solutii:
1111
112
13
22
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,s[100];
void citire()
{f>>n;
}
void afis()
{for(i=1;i<=k;i++)g<<x[i];
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]+s[k-1]<n){x[k]++;s[k]=s[k-1]+x[k];
if(s[k]==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}

Problema 16
Sa se decompuna un numar in suma de numere prime. Generati toate solutiile.
#include<fstream.h>
#include<iostream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i,s[100];
void citire()
{f>>n;
}
int prim(int p)
{if(p==1)return 0;
for(int d=2;d<=p/2;d++)if(p%d==0)return 0;
return 1;
}
int cont(int k)
{for(i=1;i<=k;i++)if(prim(x[i])==0)return 0;
return 1;
}
void afis()
{if(cont(k)){g<<n<<'='<<x[1];
for(i=2;i<=k;i++)g<<'+'<<x[i];
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]+s[k-1]<n){x[k]++;s[k]=s[k-1]+x[k];
if(s[k]==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}
Exemplu:n=8
8=2+2+2+2
8=2+3+3
8=3+2+3
8=3+3+2
8=3+5

8=5+3

Problema 17

N copii se aseaza in cerc. Se cunosc numele celor n copii. Sa se gaseasca toate


posibilitatile de rearanjare in cerc.
#include<fstream.h>
#include<iostream.h>
#include<string.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int x[100],k,n,i;
char v[100][20];
void citire()
{f>>n;
for(i=1;i<=n;i++){f.get();f.get(v[i],20);}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void afis()
{for(i=1;i<=n;i++)g<<v[x[i]]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();back();
f.close();g.close();return 0;
}

Problema 18
N copii se aseaza in sir indian. Se cunosc numele celor n copii. Sa se gaseasca toate posibilitatile
de aranjare in sir astfel incat un baiat sa urmeze dupa cel mult doua fete alaturate.
//daca( x[i]%2==0) inseamna ca x[i] e fata.
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k;
void citire()
{f>>n;
}
int cont1()
{for(i=1;i<n-1;i++)if(x[i]%2==0&&x[i+1]%2==0&&x[i+2]%2==0)return 0;
return 1;
}
void afis()
{if(cont1()){for(i=1;i<=n;i++)g<<x[i]<<' ';
g<<'\n';}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:n=6
Etc..
123654
124356
124365

124536
124563
125346
1 2 5 3 6 4 etc.
Problema 19

N copii au fost asezati in sir indian. Se cunoaste configuratia initiala. Sa se reaseze copiii
astfel incat fiecare copil sa urmeze dupa un alt copil, diferit de cel din configuratia
initiala.
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,v[100];
void citire()
{f>>n;
for(i=1;i<=n;i++)f>>v[i];
}
int cont1()
{for(i=2;i<=n;i++)if(v[x[i]-1]==v[x[i-1]])return 0;
return 1;
}
void afis()
{if(cont1()){for(i=1;i<=n;i++)g<<v[x[i]]<<' ';
g<<'\n';}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:n=6 si numerele: 1, 4, 3, 5, 7, 2.
134527
134752

134275
137452
137425
137542
Problema 20

Se citeste un numar. Sa se genereze toate numerele avand aceleasi cifre ca el. Care este
cel mai mare?
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,v[100],a,b;
void citire()
{f>>n;i=0;
while(n){v[++i]=n%10;n/=10;}
n=i;for(i=1;i<=n/2;i++){a=v[i];v[i]=v[n-i+1];v[n-i+1]=a;}
}
int cont1()
{a=0;
for(i=1;i<n;i++)if(v[x[i]]>=v[x[i+1]])a=a*10+v[x[i]];
else return 0;
return a*10+v[x[n]];
}
void afis()
{if(cont1())b=cont1();
for(i=1;i<=n;i++)g<<v[x[i]];
g<<'\n';
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();//for(i=1;i<=n;i++)g<<v[i]<<' ';
back();g<<"cel mai mare este "<<b;
f.close();g.close();return 0;
}
Exemplu:n=25739

25739
25793
25379 etc. cea mai mare este 97532.
Problema 21

N copii au fost asezati in sir indian. Se cunoaste configuratia initiala. Sa se reaseze copiii
astfel incat fiecare copil sa se situeze intre alti copii, diferiti de cei din configuratia
initiala.
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,v[100];
void citire()
{f>>n;
for(i=1;i<=n;i++)f>>v[i];
}
int cont1()
{for(i=2;i<=n;i++)if(v[x[i]-1]==v[x[i-1]]||v[x[i]+1]==v[x[i+1]])return 0;
return 1;
}
void afis()
{if(cont1()){for(i=1;i<=n;i++)g<<v[x[i]]<<' ';
g<<'\n';}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:n=6 si configuratia initiala 1 2 3 4 5 6
132465
132654

135264
135462
136254
1 3 6 4 2 5 etc,
Problema 22

Plata unei sume in bancnote de n tipuri. Solutia cea mai lunga (scurta)
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],S,j,s[100],k,v[100];
void citire()
{f>>S>>n;
}
void afis()
{g<<S<<'='<<x[1];
for(i=2;i<=k;i++)g<<'+'<<x[i];
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]+s[k-1]<S&&x[k]<n){x[k]++;s[k]=s[k-1]+x[k];
if(s[k]==S)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:S=15,n=5;
Etc
15=5+5+1+2+1+1
15=5+5+1+2+2
15=5+5+1+3+1
15=5+5+1+4
15=5+5+2+1+1+1
15=5+5+2+1+2
15=5+5+2+2+1
15=5+5+2+3
15=5+5+3+1+1
15=5+5+3+2
15=5+5+4+1
15=5+5+5

Etc

Problema 23

Problema drapelelor.

Sa se afiseze ca drapel

#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,v[100];
void citire()
{n=6;m=3;
}
void afis()
{for(i=1;i<=k;i++){if(x[i]==1)g<<'A';
if(x[i]==2)g<<'G';
if(x[i]==3)g<<'R';
if(x[i]==4)g<<'V';
if(x[i]==5)g<<'P';
if(x[i]==6)g<<'N';}
g<<'\n';
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==m)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Va afisa:
AGR
AGV
AGP
AGN
ARG

ARV
ARP
ARN
AVG
Problema 24
Sa se genereze anagramele unui cuv
#include<iostream.h>
#include<fstream.h>
#include<string.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k;
char cuv[100];
void citire()
{f>>n;
f.get();f.get(cuv,100);
}
void afis()
{for(i=1;i<=k;i++)g<<cuv[x[i]];
g<<'\n';
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:n=4 si cuvantul NICU// in fata cuvantului se tasteaza un spatiu.
NICU
NIUC
NCIU
NCUI
NUIC
NUCI
INCU

INUC
ICNU
ICUN
IUNC
Problema 25

Sa se genereze toate triunghiurile de perimetru n


#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,s[100];
void citire()
{f>>n;
}
int cont1(int k)
{if(x[1]+x[2]>x[3]&&x[2]+x[3]>x[1]&&x[1]+x[3]>x[2])return 1;
else return 0;
}
void afis()
{if(cont1(k)){for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void back()
{k=1;x[k]=0;
do{while(x[k]+s[k-1]<n){x[k]++;s[k]=s[k-1]+x[k];
if(cont(k))if(s[k]==n&&k==3)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu:n=55
2 26 27
2 27 26

3 25 27
3 27 25
Etc
Problema 26

Intre n persoane care stau pe scaune s-au iscat conflicte. Acestea stau pe scaune
numerotate de la 1 la n. Scrieti un program care sa afiseze toate modurile posibile de
reasezare a persoanelor astfel incat sa nu se gaseasca alaturi doua persoane in conflict.
//1-nu se dusmanesc 0-se dusmanesc.
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,a[100][100],j;
void citire()
{f>>n;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)f>>a[i][j];
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;}
int cont1(int k)
{for(i=1;i<n;i++)if(a[x[i]][x[i+1]]==0||a[x[i+1]][x[i]]==0)return 0;
return 1;}
void afis()
{if(cont1(k)){for(i=1;i<=n;i++)g<<x[i]<<' ';
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==n)afis();
else {k++;x[k]=0;}
}
k--;}
while(k>0);}
int main()
{citire();
back();
f.close();g.close();return 0;}
Exemplu:n=7 si matricea de dusmanie:
1011111
1111111
0111011
1101111
1111101

1101111
1011101
Se va afisa 1 4 5 7 3 2 6, etc
Problema 27

Sa se genereze toate matricile binare (avand 0 si 1) simetrice cu nxn componente.


#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,a[100][100],j,r;
void citire()
{f>>n;
}
void cont()
{r=0;
for(i=1;i<=n;i++){r=0;
for(j=1;j<=n;j++){a[i][j]=x[++r];a[j][i]=a[i][j];}}
}
void afis()
{cont();
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
g<<a[i][j]<<' ';
g<<'\n';}
g<<'\n';
}
void back()
{k=1;x[k]=-1;
do{while(x[k]<1){x[k]++;
if(k==n)afis();
else {k++;x[k]=-1;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}

Problema 28

Sa se genereze o secventa de n sunete avand lungimea p care respecto o anumita


conditie . exemplu conditie: oricare doua sunete alaturate sa nu fie pare,
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,p;
void citire()
{f>>n>>p;
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k]||x[i]%2==0&&x[i+1]%2==0)return 0;
return 1;
}
void afis()
{for(i=1;i<=k;i++)g<<x[i]<<' ';
g<<'\n';
}
void back()
{k=1;x[k]=0;
do{while(x[k]<n){x[k]++;
if(cont(k))if(k==p)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()
{citire();
back();
f.close();g.close();return 0;
}
Exemplu: n=6 p=4
1234
1235
1236
1253
1254
1256
1325
1345

Problema 29

La un spectacol trebuie sa interpreteze cate o poezie copiii A, B, C, D, E astfel incat


copilul D sa recite inainte de A si B. Sa se genereze toate posibilitatile de recitare a
poeziilor.
#include<iostream.h>
#include<fstream.h>
ifstream f("intrare.in");
ofstream g("iesire.out");
int n,m,i,x[100],k,nr,j,p,a;
int cont1()
{nr=0;
for(i=1;i<=3;i++)
if(x[i]==4){nr=0;
for(j=i+1;j<=5;j++)if(x[j]==1||x[j]==2)nr++;
if(nr==2)return 1;
else return 0;
}
}
int cont(int k)
{for(i=1;i<k;i++)if(x[i]==x[k])return 0;
return 1;
}
void afis()
{if(cont1())
{for(i=1;i<=k;i++)
{if(x[i]==1)g<<"A ";
if(x[i]==2)g<<"B ";
if(x[i]==3)g<<"C ";
if(x[i]==4)g<<"D ";
if(x[i]==5)g<<"E "; }
g<<'\n';}
}
void back()
{k=1;x[k]=0;
do{while(x[k]<5){x[k]++;
if(cont(k))if(k==5)afis();
else {k++;x[k]=0;}
}
k--;
}
while(k>0);
}
int main()

{back();
f.close();g.close();return 0;
}

You might also like