Upload
mihai-iulian-luca
View
238
Download
4
Embed Size (px)
DESCRIPTION
Probleme rezolvate prin metoda backtracking la informatica
Citation preview
Metoda Backtracking
Problema 1Problema 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=31 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
Problema 2Problema 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;1 2 3 1 2 4 1 3 2 1 3 4 1 4 2 1 4 3 2 1 3 2 1 4 2 3 1 2 3 4 2 4 1 2 4 3 3 1 2 3 1 4
3 2 1Problema 3Problema 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=31 1 1 1 1 2 1 1 3 1 1 4 1 2 2 1 2 3 1 2 4 1 3 3 1 3 4 2 2 2
2 2 3Problema 4Permutari , 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 5Se 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 6Problema 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 7Problema 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,81 3 2 5 4 7 8 6 1 3 2 5 4 8 6 7 1 3 2 5 6 4 8 7 1 3 2 5 6 7 8 4 1 3 2 5 6 8 4 7 1 3 2 5 7 4 8 6 1 3 2 5 7 8 4 6 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, alexnicu 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 ioanaetc.
Problema 11Gigel 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 35 7 7 5 1 3
3 1 etc
Problema 12Sa 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 13Se 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 14Sa 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 15Sa se genereze toate partitiile unui numar (sa se descompuna in suma de numere). Ex: n=4 Solutii:
1 1 1 11 1 21 32 2#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 16Sa 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=88=2+2+2+28=2+3+38=3+2+38=3+3+28=3+58=5+3
Problema 17N 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 18N 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=6Etc..1 2 3 6 5 4 1 2 4 3 5 6 1 2 4 3 6 5 1 2 4 5 3 6 1 2 4 5 6 3 1 2 5 3 4 6 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.1 3 4 5 2 7 1 3 4 7 5 2 1 3 4 2 7 5 1 3 7 4 5 2 1 3 7 4 2 5 1 3 7 5 4 2 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=25739257392579325379 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 61 3 2 4 6 5 1 3 2 6 5 4 1 3 5 2 6 4 1 3 5 4 6 2 1 3 6 2 5 4 1 3 6 4 2 5 etc,Problema 22Plata 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+115=5+5+1+2+215=5+5+1+3+115=5+5+1+415=5+5+2+1+1+115=5+5+2+1+215=5+5+2+2+115=5+5+2+315=5+5+3+1+115=5+5+3+215=5+5+4+115=5+5+5Etc…
Problema 23Problema 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:AGRAGVAGPAGNARGARVARPARNAVGProblema 24Sa 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.NICUNIUCNCIUNCUINUICNUCIINCUINUCICNUICUNIUNCProblema 25Sa 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=552 26 27 2 27 26 3 25 27 3 27 25 Etc
Problema 26Intre 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:1 0 1 1 1 1 11 1 1 1 1 1 10 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 11 0 1 1 1 0 1Se va afisa 1 4 5 7 3 2 6, etc
Problema 27Sa 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=41 2 3 4 1 2 3 5 1 2 3 6 1 2 5 3 1 2 5 4 1 2 5 6 1 3 2 5 1 3 4 5
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;}