online: 9; azi: 1407; total: 51862 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 (n< = m) care se pot forma cu aceste cifre şi care conţin toate cele n cifre.
# include < iostream >
using namespace std ;
void generateNumbers ( int digits [], int m, int usedDigits [], int usedCount , int currNumber ) {
if (m == 0 ) {
cout << currNumber << " " ;
return ;
}
for ( int i = 0 ; i < usedCount ; i++) {
int newNumber = currNumber * 10 + usedDigits [i];
generateNumbers ( digits , m - 1 , usedDigits , usedCount , newNumber );
}
return ;
}
int main () {
int n, m;
cout << " Introduceti numarul de cifre distincte: " ;
cin >> n;
int digits [n];
cout << " Introduceti cifrele distincte: " ;
for ( int i = 0 ; i < n; i++) {
cin >> digits [i];
}
cout << " Introduceti numarul de cifre pentru numerele de generat: " ;
cin >> m;
int usedDigits [n];
int usedCount = 0 ;
for ( int i = 0 ; i < n; i++) {
usedDigits [ usedCount ++] = digits [i];
generateNumbers ( digits , m - 1 , usedDigits , usedCount , digits [i]);
usedCount --;
}
cout << endl ;
return 0 ;
}

Explicație:
Pentru a genera toate numerele de m cifre care conțin toate cele n cifre distincte date, putem folosi o soluție recursivă. În cadrul acestei soluții, la fiecare pas adăugăm o cifră la numărul generat până acum, prin combinarea cifrelor disponibile. Pentru a evita dublarea cifrelor, am utilizat un vector " usedDigits " care conține cifrele folosite până în acel moment, și un contor " usedCount " care indică numărul de cifre utilizate. La începutul programului, folosim fiecare cifră aflată în vectorul " digits " ca primă cifră pentru numerele de generat și apoi apelăm funcția recursivă " generateNumbers " pentru a genera restul cifrelor. Pentru a garanta că numărul de cifre generate este egal cu m, decrementăm valoarea lui m la fiecare apel recursiv. Când m ajunge la zero, numărul generat este afișat.