Professional Documents
Culture Documents
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
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
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
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
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
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
Problema 28
Problema 29
{back();
f.close();g.close();return 0;
}