Sunteți pe pagina 1din 4

Implementarea algoritmului

Backtracking

Variabile globale:

0 int st[100]; //solutia vectorului stiva

1 as (are succesor) { 1, daca pe nivelul k mai exista valori de testat

0, in caz contrar

2 ev (e valid) - verifica daca combinatia variabila obtinuta indeplineste


conditiile de validare

{1, daca combinatia partiala indeplineste conditiile

0, in caz contrar

Subprograme:

3 functia procedurala init() - are rolul de a initializa varful stivei, de obicei


cu valoarea 0. Daca 0 face parte din multimea
valorilor posibile pentru un st[i], atunci
varful stivei va fi intializat cu (-1) sau
oricare alta valoare ce nu face parte
din multimea valorilor posibile pentru un
element;

4 functia succesor() - verifica daca mai exista vreo valoare netestata inca
pe nivelul k, caz in care se adauga in
combinatia partiala; va intoarce valoarea 1
sau 0 catre variabila as;

5 functia operand valid() - verifica daca combinatia partiala la care s-a


ajuns indeplineste sau nu conditiile de
validare; intoarce 1 sau 0 catre variabila
ev;

6 functia operand solutie() - verifica daca s-a ajuns la solutia finala


7 functia procedurala tipar() - are rolul de a afisa solutia finala

8 functia procedurala bkt() - implementeaza algoritmul backtracking; de


obicei, ea este aceeasi cam pentru toate
programele

void bkt()
{k=1;
init();
while(k>0)
{as=1; ev=0;
while(as&&!ev)
{as=succesor();
if (as)
ev=valid();
}
if(as)
if (solutie())
tipar;
else
{k=k+1;
int c();
}
else
k=k+1;
}
}

Se pleaca de pe primul element din stiva. Se initializeaza elementele si cat


timp exista elemente in stiva, la fiecare pas:

-se cauta in mod repetat de un succesor valid

-daca am gasit succesor valid si daca am ajuns la solutia finala,


atunci se afiseaza

-altfel, inseamna ca avem o combinatie partiala valida pe care o


vom initializa

-altfel, inseamna ca nu mai exista nici o valoare netestata pe


nivelul k si facem pas inapoi pe nivelul anterior.

Se citeste de la tastatura un nr natural n. Se cere sa se genereze toate


permutarile multimii {1,2,...,n}.

#include<iostream>
using namespace std;
int st[100],n,k,as,ev;
void init();
{st[k]=0;
}
int succesor()
{if(st[k]=st[k+1];
return 1;
}
else
return 0;
}

Sa se genereze toate permutarile multimii de la 1 pana la n in care nu


apar nr consecutive.

int valid()
{for(int i=1;i<k;i++)
if(st[i]==st[k];
return 0;
if(k>1&&abs(st[k]=st[k-1])==1)
return 0;
return 1;
}
int solutie()
{return k==n;
}
void tipar()
{for(int i=1;i<=k;i++)
cout<<st[i]<<' ';
cout<<endl;
}
void bkt()
{k=1;init();
while(k>0)
{as=1;ev=0;
while(as&&!ev)
{as=succesor();
if(as)
ev=valid();
}
if(as)
if(solutia())
tipar();
else
{k=k+1;
init();
}
else
k=k-1;
}
int main()
{cout<<"n=";cin>>n;
bkt();
return 0;
}

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