Sunteți pe pagina 1din 11

BACKTRACKING

Definitie: Backtracking este o metoda de programare care se folosește atunci cand


pentru o problema dorim sa obtinem toate soluțiile posibile sau când dintre aceste
posibile vrem sa obtinem solutia optima.

OBS: Cea mai costisitoare metoda de programare ca timp si ca memorie.

● In general, soluția problemei se va afișa cu ajutorul unui vector de soluții, în care


fiecare element din acest vector aparține unei mulțimi ordonate și finite de valori.

Permutari
n=3
123 v=(v1,v2,v3) s1={1,2,3}
132 s2={1,2,3}
213 s3={1,2,3}
231
312
321

● Avem un vector v=v1,v2,..,vn, fiecare element vk cu k mergand de la 1 la n


aparține unei mulțimi de valori sk.
● În anumite cazuri particulare, multimile s1,s2,...,sn coincid. Se procedeaza astfel:
1. La fiecare pas k pornim de la soluție partiala v=v1,v2,...,vk-1 determinată până în
acel moment și încercam să extindem aceasta solutie cu nivelul k
2. Cautam in multimea sk un nou element
3. Daca exista un element neselectat inca, verific daca acest element îndeplinește
condițiile impuse de problema, numite condiții de continuare/validare.
4. Dacă sunt respectate aceste condiții(vk este bun), se adauga acest element pe
nivelul k
5. Verificăm dacă am obtinut o soluție completa(finala). Daca da, o afisez si se reia
algoritmul de la pasul 1. Daca nu, se completează nivelul următor(k+1) exact in
acelasi fel.
6. Dacă nu sunt respectate condițiile de continuare(valoarea pusă pe nivelul k nu e
buna), atunci încercăm să punem pe acest nivel următoarea valoare posibila din
mulțimea sk.
7. Dacă nu mai exista nici o valoare care se poate pune pe nivelul k, atunci se
coboară pe nivelul k-1 și încercam să punem acolo următoarea valoare posibila.
Permutari plus nr de solutii
#include <iostream>

using namespace std;


int n, v[30];
int c;
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
return 1;

int solutie(int k)
{
if(k==n)
return 1;
else
return 0;
}

void afisare(int k)
{
for(int i=1; i<=k; i++)
cout<<v[i]<<" ";
cout<<endl;

c++;

void back(int k)
{
for(int i=1; i<=n; i++)
{
v[k]=i;
if(valid(k)==1)
if(solutie(k)==1)
afisare(k);
else
back(k+1);
}

}
int main()
{
cin>>n;
back(1);
cout<<c;
return 0;
}

Probl 3/manual 153


int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(v[k]==k)
return 0;
return 1;
}

/// pe doua nivele consecutive


using namespace std;
int n, v[30];
int c;
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(k>1)
if(v[k]%2==0 && v[k-1]%2==0)
return 0;
return 1;
}
///nr de aceeași paritate
using namespace std;
int n, v[30];
int c;
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(k>1)
if((v[k]+v[k-1])%2==0)
return 0;
return 1;
}

Aranjamente

#include <iostream>
using namespace std;
int n, v[30],p;
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
return 1;

int solutie(int k)
{
if(k==p)
return 1;
else
return 0;
}

void afisare(int k)
{
for(int i=1; i<=k; i++)
cout<<v[i]<<" ";
cout<<endl;
}

void back(int k)
{
for(int i=1; i<=n; i++)
{
v[k]=i;
if(valid(k)==1)
if(solutie(k)==1)
afisare(k);
else
back(k+1);
}

}
int main()
{
cin>>n;
cin>>p;
back(1);
return 0;
}

Combinari
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(k>1 && v[k]<v[k-1])
return 0;
return 1;

#include <iostream>
using namespace std;
“eroare”///problema1/manual
int n,v[30],x[30];
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(v[k]!=v[i]&& (v[k]-v[i])!=k-i)
return 1;

int solutie(int k)
{
if(k==n)
return 1;
else
return 0;
}
void afisare(int k)
{
for(int i=1; i<=k; i++)
cout<<v[i]<<" ";
cout<<endl;

void back(int k)
{
for(int i=1; i<=n; i++)
{
v[k]=x[i];
if(valid(k)==1)
if(solutie(k)==1)
afisare(k);
else
back(k+1);
}

}
///
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>x[i];
back(1);
return 0;
}
Produsul cartezian a n multimi:

#include <iostream>
using namespace std;
///produsul cartezian a n multimi
/*
n=3
A1={x1,x2,x3} m=3
A2={y1,y2} m=2
A3={z1,z2,z3} m=3
nr de multimi=3x2x3=18 solutii
*/
int n, v[50],nr[50];
int valid(int k)
{
return 1;
}
int solutie(int k)
{
if(k==n)
return 1;
else
return 0;
}
void afisare(int k)
{
for(int i=1; i<=k; i++)
cout<<v[i]<<" ";
cout<<endl;
}
void back(int k)
{
for(int i=1; i<=nr[k]; i++)
{
v[k]=i;
if(valid(k))
if(solutie(k))
afisare(k);
else
back(k+1);
}
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>nr[i];
back(1);
return 0;
}
Submultimi
#include <iostream>
using namespace std;
///submultimi
/*
A={1,2,3}
1,2,3,
1 2, 1 3, 2 3
123

*/
int n,p,v[100];
int valid(int k)
{
for(int i=1; i<=k-1; i++)
if(v[k]==v[i])
return 0;
if(k>1 && v[k]<v[k-1])
return 0;
return 1;

}
int solutie(int k)
{
if(k==p)
return 1;
else
return 0;
}

void afisare(int k)
{
for(int i=1; i<=k; i++)
cout<<v[i]<<" ";
cout<<endl;
}

void back(int k)
{
for(int i=1; i<=n; i++)
{
v[k]=i;
if(valid(k))
if(solutie(k))
afisare(k);
else
back(k+1);
}

}
int main()
{
cin>>n;
for(p=1; p>=n; p++)
back(1);
return 0;
}

S-ar putea să vă placă și