Documente Academic
Documente Profesional
Documente Cultură
Înainte de a scrie programul care ne va obţine soluţiile, trebuie sǎ stabilim unele detalii cu
privire la:
- vectorul soluţie (SOLUTIE(k)) – câte componente are (Exemplu pentru permutări
vectorul soluție are n valori)
- mulţimea de valori posibile (EXISTA(k)) pentru fiecare componentǎ (sunt foarte
importante limitele acestei mulţimi). (Exemplu pentru permutări x[k]<=n, deci, x[k] ia valori de
la 1 la n , pentru orice valoare k de la 1 la n)
- condiţiile de continuare (VALID (K)) (condiţiile ca o valoare x[k]sǎ fie acceptatǎ).
). (Exemplu pentru permutări, fiecare element x[k] ales la pasul k trebuie să fie diferit de
elementul precedent x[k] # x[i] oricare i de la 1 la k-1, pentru orice valoare k de la 1 la n)
Funcţia EXISTA(k) verificǎ dacǎ ultima valoare aleasǎ pentru componenta xk nu a atins
limita maximǎ admisǎ (indicele de valoare maximǎ). Întrucât elementele sunt testate în ordine,
acest lucru este echivalent cu a verifica dacǎ mai avem valori netestate încǎ pentru aceastǎ
componentǎ.
Funcţia VALID(k) verificǎ dacǎ valoarea aleasǎ pentru x[k] îndeplineşte condiţiile de
continuare, deci dacǎ aceastǎ combinaţie parţialǎ v1v2…vk poate sǎ conducǎ la o soluţie.
☺Observaţie: La implementarea acestei funcţii se identificǎ acele cazuri în care acest lucru
este posibil, RETURNÂND VALOAREA 0 !!!.
Funcţia SOLUTIE(k) verificǎ dacǎ s-a ajuns la o soluţie finalǎ (ÎN MULTE
PROBLEME LUCRATE PANĂ ACUM k==n).
Procedura TIPAR(k) tipǎreşte o soluţie.
Algoritmul propus este:
void BT()
{ int k;
K ← 1;
INIT(k);
while k>0 do
if (EXISTA(k))
{
x[k]=x[k]+1;
if VALID(k)
if SOLUTIE(k)
TIPAR(k)
else
{
K ← k+1;
INIT(k);
};
}
else
k ← k-1;
}
int VALID(int k)
{
int i;
for (i=1;i<k;i++)
if (x[i]==x[k])
return 0;
return 1;
}
void BT()
{ int k;
k:=1;
x[k]=0;
while k>0 do
if (x[k]<n)
{
x[k]=x[k]+1;
if (VALID(k))
if (k==n)
TIPAR(k)
else
{
k=k+1;
x[k]=0;
};
}
else
k=k-1;
}
int main()
{
cin>>n;
BT();
}