probleme backtracking

Post on 03-Jan-2016

238 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

Probleme rezolvate prin metoda backtracking la informatica

TRANSCRIPT

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;}

top related