Sunteți pe pagina 1din 2

Analiza problemelor care se vor rezolva cu

metoda Backtracking - model


Enunt:
Se citește un număr natural nenul n, apoi n numere naturale distincte. Să se afişeze, în ordine lexicografică,
permutările mulțimii formate din cele n numere citite.
Fişierul de intrare permutari2.in conţine pe prima linie numărul n, ia r pe a doua linie n numere naturale.
Fişierul de ieşire permutari2.out va conţine pe fiecare linie elementele unei permutări, separate prin câte un
spaţiu.
Restrictii:
 0<n<9
 cele n numere de pe a doua linie a fișierului de intrare sunt mai mici decât 100
Exemplu:
permutari2.in permutari2.out
3 30 40 70
40 70 30 30 70 40
40 30 70
40 70 30
70 30 40
70 40 30

Întrebare Răspuns
1. Care sunt datele de intrare si care este formatul n- numărul de elemente din mulțime
lor(cum le memorez)? vector a cu n elemente numere întregi
n=3
indice 1 2 3
a[i] 40 70 30
ordonate 30 40 70

2. Care sunt datele de ieșire si care este formatul  Elementele mulțimii date, permutate
lor(cum le memorez)?  Memorez in vectorul soluție din BKT doar indicii
elementelor mulțimii date
 Permutări din indici => afișez elementele
mulțimii inițiale pe baza indicilor din soluție
Daca o soluție av avea forma :
2 3 1 => pe ecran : 40 70 30
3. Trebuie ordonate crescător/descrescător? DA - crescător

4. Care sunt mulțimile de valori posibile pentru Știm ca fiecare element din soluție notat s[k]
fiecare el. din soluție: reprezintă un indice a unui element din mulțimea
A1={vi1…vf1} data:
A2={vi2…vf2} s[1] ∈A1= {1,2,..,n}
…. s[2] ∈A2= {1,2,..,n}
Ak={vik…vfk} ....
s[k] ∈Ak= {1,2,..,n}
 In funcția BKT valoarea inițială in
instrucțiunea for va fi 1, iar valoarea finala va
fi n
 for(int i=1; i<=n; i++)...
5. Care sunt condițiile interne/condițiile de
continuare?
- In cuvinte Elementele s[1],...s[k-1],s[k] trebuie sa fie distincte
 Nu am voie sa utilizez într-o soluție un indice
de doua ori, pentru ca as folosi elementul
respectiv de doua ori într-o soluție(greșit)
- In pseudocod/C++  Varianta a:

int verifica(int k)
{
for(int i=1; i<=k-1;i++)
if(s[i]==s[k])
return 0;
return 1;
}
 Varianta b(folosind vectori de frecventa)
int fr[100]={0}; /// vector caracteristic cu
semnificatia ca
o fr[i]=0 daca pozitia i nu apar in
solutie
o fr[i]=1 atunci cand pozitia i este
folosita in solutie
void BKT(int k)
{ for(int i=1;i<=n; i++)
{ if (fr[i]==0)
/// verific daca poz i este utilizata
{ s[k]=i;
fr[i]=1;
///o marchez utilizata pozitia i
if(k==n)
afisare_solutie(k);
else
BKT(k+1);
fr[i]=0;
///eliberare pozitia i
}
}

6. Care este condiția ca sa obțin o soluție? Toate elementele mulțimii date sunt in
soluție:
k==n
sau functia soutie:

int solutie(int k)
{return k==n;}

7. Afișarea soluție: cout<<A[s[i]] pentru oricare i=1,k

void afisare_solutie(int k)
{ for(int i=1;i<=k;i++)
cout<< A[s[i]]<<” ”;
cout<<endl;
}

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