Sunteți pe pagina 1din 7

Probleme backtracking

Permutari

#include <iostream>
using namespace std;
int st[11],n,k;
bool as,ev;
void init(int st[11],int k)
{
st[k]=0;///se initializeaza nivelul k, cu predecesorul primei valori din
multime
}

void succesor(int st[11],int k,bool &as)


{
if(st[k]<n)///daca pe nivelul k din stiva exista valori netestate
{
st[k]=st[k]+1;///o punem pe prima
as=true;///si semnalizam ca avem succesor
}
else
as=false;///in caz contrat inseamna ca nu avem succesor
}

bool solutie(int st[11],int k)


{
if(k==n)///daca s=a ajuns la nivelul n(s-a umplut stiva)
return true;///am obtinut solutie
else
return false;///inca nu am obtinut solutia
}

void valid(int st[11],int k, bool &ev)


{
int i;
ev=true;///presupun ca elementul plasat pe nivelul k
for(i=1; i<k; i++)///verific daca elementul mai exista pe vivelele
anterioare
if(st[i]==st[k])///daca se repeta
ev=false;///nu validam
}

void tipar(int st[11], int k)


{
int i;
for(i=1; i<=k; i++)
cout<<st[i]<<' ';
cout<<endl;
}

int main()///doar asta ii rutina


{
cin>>n;///citim n=cardinalul multimii de elemente pe care le permutam
k=1;///pornim de la primul nivel
init(st,k);///il initializam apeland functia init
while(k)///cat timp k este mai mare ca zero(sunt pe un nivel al stivei)
{
do///caut succesor valid pentru nivelul k
{
succesor(st,k,as);
if(as) ///daca am succesor
valid(st,k,ev);///incerc sa il validez
}
while(as && !ev); ///pana cand ori nu am succesor, ori am succesor
validat
if(as)///daca am plasat un element valid pe nivelul k
if(solutie(st,k)) ///verific daca am obtinut o solutie(daca s-a
umplut stiva)
tipar(st,k);/// daca am obtinut solutie o tiparesc
else///daca nu am obtinut solutie.. adc nu am umplut stiva
{
k++;
init(st,k);///il initializez
}
else///daca nu am avut succesor
k--;///contor in stiva
}
return 0;
}

Combinari
#include <iostream>
#include <fstream>
using namespace std;
int st[11],n,k;
bool as,ev;
void init(int st[11],int k)
{
    if(k==1)
        st[k]=0;///se initializeaza nivelul k, cu predecesorul primei valori din multime
    else
        st[k]=st[k-1];///se initializeaza nivelul , cu valoarea de pe nivelul anterior
    ///pentru ca sa generam strict crescator

void succesor(int st[11],int k,bool &as)


{
    if(st[k]<n-p+k)///daca pe nivelul k din stiva exista valori netestate
  {
        st[k]=st[k]-1;///o punem pe prima
        as=true;///si semnalizam ca avem succesor
  }
    else
        as=false;///in caz contrar inseamna ca nu avem succesor
}

bool solutie(int st[11],int k)


{
    if(k==p)///daca s-a ajuns la nivelul n(s-a umplut stiva)
        return true;///am obtinut solutie
    else
        return false;///inca nu am obtinut solutia
}

void valid(int st[11],int k, bool &ev)


{
    int i;
    ev=true;///se valideaza
}

void tipar(int st[11], int k)


{
    int i;
    for(i=1; i<=k; i++)
        cout<<st[i]<<' ';
    cout<<endl;
}

int main()///doar asta ii rutina


{
    cin>>n;///citim n=cardinalul multimii de elemente pe care le permutam
    k=1;///pornim de la primul nivel
    init(st,k);///il initializam apeland functia init
    while(k)///cat timp k este mai mare ca zero(sunt pe un nivel al stivei)
  {
        do///caut succesor valid pentru nivelul k
    {
            succesor(st,k,as);
            if(as) ///daca am succesor
                valid(st,k,ev);///incerc sa il validez
    }
        while(as && !ev); ///pana cand ori nu am succesor, ori am succesor validat
        if(as)///daca am plasat un element valid pe nivelul k
            if(solutie(st,k)) ///verific daca am obtinut o solutie(daca s-a umplut stiva)
                tipar(st,k);/// daca am obtinut solutie o tiparesc
            else///daca nu am obtinut solutie.. adc nu am umplut stiva
      {
                k++;
                init(st,k);///il initializez
      }
        else///daca nu am avut succesor
            k--;///contor in stiva
  }
    return 0;
}

Aranjamente
#include <iostream>
#include <fstream>
using namespace std;
int st[11],n,k;
bool as,ev;
void init(int st[11],int k)
{
    st[k]=n+1;///se initializeaza nivelul k, cu predecesorul primei valori din multime
}

void succesor(int st[11],int k,bool &as)


{
    if(st[k]>1)///daca pe nivelul k din stiva exista valori netestate
  {
        st[k]=st[k]-1;///o punem pe prima
        as=true;///si semnalizam ca avem succesor
  }
    else
        as=false;///in caz contrar inseamna ca nu avem succesor
}

bool solutie(int st[11],int k)


{
    if(k==p)///daca s-a ajuns la nivelul n(s-a umplut stiva)
        return true;///am obtinut solutie
    else
        return false;///inca nu am obtinut solutia
}

void valid(int st[11],int k, bool &ev)


{
    int i;
    ev=true;///presupun ca elementul plasat pe nivelul k
    for(i=1; i<k; i++)///verific daca elementul mai exista pe vivelele anterioare
        if(st[i]==st[k])///daca se repeta
            ev=false;///nu validam
}

void tipar(int st[11], int k)


{
    int i;
    for(i=1; i<=k; i++)
        cout<<st[i]<<' ';
    cout<<endl;
}

int main()///doar asta ii rutina


{
    cin>>n;///citim n=cardinalul multimii de elemente pe care le permutam
    k=1;///pornim de la primul nivel
    init(st,k);///il initializam apeland functia init
    while(k)///cat timp k este mai mare ca zero(sunt pe un nivel al stivei)
  {
        do///caut succesor valid pentru nivelul k
    {
            succesor(st,k,as);
            if(as) ///daca am succesor
                valid(st,k,ev);///incerc sa il validez
    }
        while(as && !ev); ///pana cand ori nu am succesor, ori am succesor validat
        if(as)///daca am plasat un element valid pe nivelul k
            if(solutie(st,k)) ///verific daca am obtinut o solutie(daca s-a umplut stiva)
                tipar(st,k);/// daca am obtinut solutie o tiparesc
            else///daca nu am obtinut solutie.. adc nu am umplut stiva
      {
                k++;
                init(st,k);///il initializez
      }
        else///daca nu am avut succesor
            k--;///contor in stiva
  }
    return 0;
}

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