Está en la página 1de 7

//combinari de n luate cate p #include<iostream.h> #include<math.

h> int st[100],n,p; void init(int k) { st[k]=st[k-1];} void succesor(int k, int &es) {if(st[k]<n) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; for(i=1;i<k;i++) if(st[k]==st[i]) ev=0;} int solutie(int k) {return k==p;} void afisare(int k) {int i; for(i=1;i<=k;i++) cout<<st[i]; cout<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(k); else {k++; init (k);} else k--;}} int main() {cout<<"n=";cin>>n; cout<<"p=";cin>>p; bkt();}

//backtracking #include<iostream.h> #include<math.h> int st[100],n; void init(int k) { st[k]=0;} void succesor(int k, int &es) {if(st[k]<n) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; for(i=1;i<k;i++) if(st[k]==st[i]||(k-i)==abs(st[k]-st[i])) ev=0;} int solutie(int k) {return k==n;} void afisare() { int i; for(i=1;i<=n;i++) cout<<st[i]; cout<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() { cout<<"n=";cin>>n; bkt();}

//generare permutari cu un parametru p #include<iostream.h> #include<math.h> int st[100],n,p; void init(int k) { st[k]=0;} void succesor(int k, int &es) {if(st[k]<n) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; for(i=1;i<k;i++) if(st[k]==st[i]) ev=0;} int solutie(int k) {return k==p;} void afisare(int k) {int i; for(i=1;i<=k;i++) cout<<st[i]; cout<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(k); else {k++; init (k);} else k--;}} int main() {cout<<"n=";cin>>n; cout<<"p=";cin>>p; bkt();}

//generare permutari #include<iostream.h> #include<math.h> int st[100],n; void init(int k) { st[k]=0;} void succesor(int k, int &es) {if(st[k]<n) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; for(i=1;i<k;i++) if(st[k]==st[i]) ev=0;} int solutie(int k) {return k==n;} void afisare() {int i; for(i=1;i<=n;i++) cout<<st[i]; cout<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() { cout<<"n=";cin>>n; bkt();}

// se citeste un numar natural n. sa se afiseze toate modalitatile de a-l descompune ca suma de nr nat consecutive. daca acest lucru nu este posibil, se va afisa mesajul "imposibil" //ex:8 nu poate fi scris ca suma de nr consecutive #include<iostream.h> #include<math.h> int st[100],n; void init(int k) { st[k]=st[k-1];} void succesor(int k, int &es) {if(st[k]<st[k-1]+1) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i,s=0;ev=1; ev=s<=n; ev=0;} int solutie(int k) {return k==n;} void afisare() { int i; for(i=1;i<=n;i++) cout<<st[i]; cout<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() { cout<<"n=";cin>>n; bkt();}

//dandu-se un numar natural n par sa se genereze toate perechile de n paranteze corect imbricate #include<iostream.h> #include<fstream.h> #include<math.h> int st[100],n,ni=0; void init(int k) { st[k]=-1;} void succesor(int k, int &es) {if(st[k]<1) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i; ni=0; for(i=1;i<=k;i++) ni=ni+st[i]; ev=ni>=k-n/2 && ni<=k/2;} int solutie(int k) {return ni==n/2;} void afisare() { int i; for(i=1;i<=n;i++) if(st[i]==0) cout<<"("; else cout<<")"; cout<<endl;} void bkt() {int k=1,es,ev; init(1); while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() { cout<<"n=";cin>>n; bkt();}

//scrieti un program care citeste d ela tastatura un numar natural nenul n (n<=20) si construieste toate numerele formate din n cifre impare cu propietatea ca oricare doua cifre alaturate dintr-un numar generat sunt consecutive in multimea numerelor impare. EX: pt n=4 se obtin numere de forma: 1313,1353,1357...7979.... #include<iostream.h> #include<fstream.h> #include<math.h> ifstream f("plata.in"); ofstream g("date.out"); int st[100],n; void afisare(int st[50],int n) {for(int i=1;i<=n;i++) g<<st[i]<<" "; g<<endl;} void init(int k) { if(st[k-1]==1) st[k]=1; else st[k]=st[k-1]-4;} void validare(int k, int &ev) {ev=st[k]!=st[k-1];} int solutie(int k) {return n==k;} void succesor(int k, int &es) { if((st[k]<st[k-1]+2) && (st[k]<9)) {st[k]=st[k]+2;es=1;} else es=0;} void bkt() {int k=1,es,ev;st[0]=7;st[1]=-1; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(st,k); else {k++; init (k);} else k--;}}

// Se cere sa se determine toate modalitatile de plata ale unei sune S utilizand cupoane de valori v1,v2...vn. Valorile se citesc din fisierul "plata.in" [S=450, n=5, v=5 10 50 100 200] #include<iostream.h> #include<fstream.h> #include<math.h> ifstream f("plata.in"); ofstream g("date.out"); int st[100],v[100],n,s,sk; void citire () {f>>s; f>>n; for(int i=1;i<=n;i++) f>>v[i];} void afisare(int st[50],int n) {for(int i=1;i<=n;i++) g<<st[i]<<" "; g<<endl;} void init(int k) { st[k]=-1;} void succesor(int k, int &es) {if(st[k]<s/v[k]) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; sk=0; for(int i=1;i<=k;i++) sk=sk+st[i]*v[i]; if(k==n) ev=s==sk; else ev=sk<=s;} int solutie(int k) {return s==sk;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(st,k); else {k++; init (k);} else k--;}} int main() {citire(); afisare(v,n); bkt();}

int main() {f>>n; bkt();}

//partitiile unui nr natural [bkt] #include<iostream.h> #include<fstream.h> #include<math.h> ifstream f("plata.in"); ofstream g("date.out"); int st[100],n,sk; void afisare(int st[50],int n) {for(int i=1;i<=n;i++) g<<st[i]<<" "; g<<endl;} void init(int k) { st[k]=0;} void succesor(int k, int &es) {if(st[k]<n-k+1) {st[k]++;es=1;} else es=0;} void validare(int k, int &ev) {int i;ev=1; sk=0; for(int i=1;i<=k;i++) sk=sk+st[i]; ev=sk<=n; } int solutie(int k) {return n==sk;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(k,ev);} while(es && !ev); if(es) if(solutie(k)) afisare(st,k); else {k++; init (k);} else k--;}}

// partitiile unei mutimi #include<iostream.h> #include<math.h> #include<fstream.h> ifstream f("date.in"); ofstream g("date.out"); int st[100],n; void init(int k) { st[k]=0;} void succesor(int k, int &es) {if(st[k]<max(k)+1) {st[k]++;es=1;} else es=0;} void validare(int ev) {ev=1;} int solutie(int k) {return k==n;} int max(int k) {int i, mx; mx=st[1]; for(i=1;i<=n;i++) if(st[i]>mx) mx=st[i]; return mx;} void citire() {f>>n; for(int i=1;i<=n;i++) f>>st[i];} void afisare() { int i; for(i=1;i<=n;i++) g<<st[i]<<" "; g<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do{succesor(k,es); if(es) validare(ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() {citire(); bkt();}

int main() {f>>n; bkt();}

// se citeste un numar natural n. sa se afiseze toate modalitatile de a-l descompune ca suma de nr nat distincte #include<iostream.h> int n,x[20]; void afisare(int l) {for(int i=1;i<=l;i++) cout<<x[i]<<" "; cout<<endl;} void bkt(int i, int sp) {int j; if(sp==n && i>2) afisare(i-1); else for(j=1;j<=n-sp;j++) if(j>x[i-1]) {x[i]=j; bkt(i+1,sp+j);}} int main () {cin>>n; x[0]=0; bkt(1,0);}

// se citeste un numar natural n. sa se afiseze toate modalitatile de a-l descompune ca suma de nr nat distincte #include<iostream.h> #include<math.h> #include<fstream.h> ifstream f("date.in"); ofstream g("date.out"); int st[100],n,s; void init(int k) { st[k]=st[k-1];} void succesor(int k, int &es) {if(st[k]<k-1) {st[k]++;es=s;} else es=0;} void validare(int ev) {ev=1;} int solutie(int k) {return s+st[k]==n;} void afisare() { int i; for(i=1;i<=n;i++) g<<st[i]; g<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;}} int main() {f>>n; bkt();}

// sa se scrie un program care sa genereze si sa scrie intr-un fisier toate cuvintele formate din n vocale mici(n-nr nat citit de la tastatura, n<10) ordonate alfabetic. #include<iostream.h> int x[10],n; char v[]="aeiou"; void abc() {int j; cout<<endl; for (j=1;j<=n;j++) cout<<v[x[j]];} void bkt(int k) {int i; for(i=0;i<=4;i++) {x[k]=i; if(k==n) abc(); else bkt(k+1);}} int main () {cin>>n; bkt(1);}

// sa se scrie un program care sa genereze si sa scrie intr-un fisier toate cuvintele formate din n vocale mici(n-nr nat citit de la tastatura, n<10) ordonate alfabetic. #include<iostream.h> #include<math.h> #include<fstream.h> ifstream f("date.in"); ofstream g("date.out"); char vocale[]="aeiou"; int st[10],n; void init(int k) { st[k]=-1;} void succesor(int k, int &es) {if(st[k]<4) {st[k]++;es=1;} else es=0;} void validare(int ev) {ev=1;} int solutie(int k) {return k==n-1;} void afisare() { char s[10]; int i; for(i=1;i<=n;i++) s[i]=vocale [st[i]]; s[i]=0; g<<s<<endl;} void bkt() {int k=1,es,ev; while(k>0) {do {succesor(k,es); if(es) validare(ev);} while(es && !ev); if(es) if(solutie(k)) afisare(); else {k++; init (k);} else k--;} } int main() {f>>n; bkt();}