online: 9; azi: 200; total: 50655 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Să se genereze toate numerele naturale, cu n cifre, care conțin p cifre k. Valorile pentru n, p şi k se citesc de la tastatură.
# include < iostream >
using namespace std ;
int n, p, k;
int nr[ 100 ]; // vectorul în care construim numărul
void init ( int k) {
nr[k] = 0 ;
}
int succesor ( int k) {
if (nr[k] < 9 ) {
nr[k]++;
return 1 ;
}
return 0 ;
}
int valid ( int k) {
// verificăm dacă avem cifra k de p ori
int cnt_k = 0 ;
for ( int i = 1 ; i <= k; i++) {
if (nr[i] == k) {
cnt_k ++;
}
}
if ( cnt_k > p) {
return 0 ; // am depășit numărul de cifre k permis
}
return 1 ;
}
int solutie ( int k) {
// verificăm dacă avem p cifre k în soluție
int cnt_k = 0 ;
for ( int i = 1 ; i <= n; i++) {
if (nr[i] == k) {
cnt_k ++;
}
}
return cnt_k == p;
}
void tipar () {
for ( int i = 1 ; i <= n; i++) {
cout << nr[i];
}
cout << endl ;
}
void bt ( int k) {
if (k > n) {
return ;
}
init (k);
while ( succesor (k)) {
if ( valid (k)) {
if (k == n && solutie (k)) {
tipar ();
}
bt (k+ 1 );
}
}
}
int main () {
cout << " Introduceti numarul de cifre al numarului : " ;
cin >> n;
cout << " Introduceti numarul de cifre " << k << " pe care trebuie sa le contina numarul : " ;
cin >> p;
cout << " Introduceti cifra " << k << " care trebuie sa fie continuta in numar : " ;
cin >> k;
bt ( 1 ); // apelul functiei de backtracking cu k=1
return 0 ;
}