online: 8; azi: 833; total: 51288 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Se citesc de la tastatură n cifre distincte. Să se genereze toate numerele de m cifre (m<n) care se pot forma cu aceste cifre - şi care conțin toate cele n cifre.
# include < iostream >
using namespace std ;
int n, m;
int cifre[ 100 ]; // vectorul cu cifrele distincte
int nr[ 100 ]; // vectorul în care construim numărul
int viz [ 100 ]; // vectorul auxiliar pentru a evita duplicatele
void init ( int k) {
nr[k] = -1 ;
}
int succesor ( int k) {
nr[k]++;
if (nr[k] < n) {
return 1 ;
}
return 0 ;
}
int valid ( int k) {
if ( viz [cifre[nr[k]]] == 0 ) {
return 1 ;
}
return 0 ;
}
int solutie ( int k) {
return k == m -1 && viz [cifre[nr[k]]] == 1 ;
}
void tipar () {
for ( int i = 0 ; i < m; i++) {
cout << cifre[nr[i]];
}
cout << endl ;
}
void bt ( int k) {
init (k);
while ( succesor (k)) {
if ( valid (k)) {
viz [cifre[nr[k]]] = 1 ;
if ( solutie (k)) {
tipar ();
} else {
bt (k+ 1 );
}
viz [cifre[nr[k]]] = 0 ;
}
}
}
int main () {
cout << " Introduceti n: " ;
cin >> n;
cout << " Introduceti cele " << n << " cifre distincte: " ;
for ( int i = 0 ; i < n; i++) {
cin >> cifre[i];
}
cout << " Introduceti m (m<n): " ;
cin >> m;
bt ( 0 ); // apelul funcției de backtracking cu k=0
return 0 ;
}