probleme backtracking

33
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 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1

Upload: mihai-iulian-luca

Post on 03-Jan-2016

237 views

Category:

Documents


4 download

DESCRIPTION

Probleme rezolvate prin metoda backtracking la informatica

TRANSCRIPT

Page 1: Probleme backtracking

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

Page 2: Probleme backtracking

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

Page 3: Probleme backtracking

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

Page 4: Probleme backtracking

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();

Page 5: Probleme backtracking

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

Page 6: Probleme backtracking

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

Page 7: Probleme backtracking

#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

Page 8: Probleme backtracking

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

Page 9: Probleme backtracking

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

Page 10: Probleme backtracking

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?

Page 11: Probleme backtracking

#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 .

Page 12: Probleme backtracking

#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

Page 13: Probleme backtracking

#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>

Page 14: Probleme backtracking

#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:

Page 15: Probleme backtracking

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>

Page 16: Probleme backtracking

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>

Page 17: Probleme backtracking

#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.

Page 18: Probleme backtracking

//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

Page 19: Probleme backtracking

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

Page 20: Probleme backtracking

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

Page 21: Probleme backtracking

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)

Page 22: Probleme backtracking

#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

Page 23: Probleme backtracking

#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

Page 24: Probleme backtracking

#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

Page 25: Probleme backtracking

#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

Page 26: Probleme backtracking

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.

Page 27: Probleme backtracking

#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

Page 28: Probleme backtracking

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

Page 29: Probleme backtracking

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