Documente Academic
Documente Profesional
Documente Cultură
Prelucrările care se fac pentru nivelul k al soluţiei se fac şi pentru nivelul k+1 al
soluţiei – şi aceste prelucrări pot fi apelate pentru elementul k+1 al soluţiei, iar
trecerea de la elementul k al soluţiei la elementul k+1 al soluţiei se face prin apelul
recursiv al acestor prelucrări. În cazul implementării recursive, condiţia de bază este
ca pentru nivelul k să nu se găsească o valoare care să îndeplinească condiţiile
interne.
Generarea permutărilor
1. Implementarea iterativă
#include<iostream>
using namesapce std;
int n,k,ev,as,s[100];
void init()
{s[k]=0;}
int succesor()
{if (s[k]<n)
{s[k]=s[k]+1; return 1;}
else return 0;}
int valid()
{for(int i=1;i<k;i++)
if (s[k]==s[i]) return 0;
return 1;}
int solutie()
{return k==n;}
void tipar()
{for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;}
void bt()
{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++; init();}
else k--;}}
int main()
{cout<<"n= "; cin>>n;
bt();
return0;}
2. Implementarea recursivă
#include<iostream>
using namesapce std;
int n, s[100];
void init(int k)
{s[k]=0;}
int succesor(int k)
{if (s[k]<n)
{s[k]=s[k]+1; return 1;}
else return 0;}
int valid(int k)
{for(int i=1;i<k;i++)
if (s[k]==s[i]) return 0;
return 1;}
int solutie(int k)
{return k==n;}
void tipar()
{for(int i=1;i<=n;i++)
cout<<s[i]<<" ";
cout<<endl;}
void bt(int k)
{init(k);
while(succesor(k))
if(valid(k))
if(solutie(k)) tipar();
else bt(k+1);}
int main()
{cout<<"n= "; cin>>n;
bt(1);
return 0;}