online: 2; azi: 576; total: 51031 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Dintr-o mulțime de n persoane, aranjate într-un şir , se elimină p persoane. Să se genereze toate posibilităţile de aranjare într-un şir a persoanelor rămase, astfel încât fiecare persoană să nu aibă aceiaşi vecini ca în şirul inițial. Valorile pentru n şi p se citesc de la tastatură.
# include < iostream >
using namespace std ;
int n, p;
int persoane[ 100 ];
bool utilizat[ 100 ];
int sirNou [ 100 ];
bool valid ( int k) {
if (k > 0 ) {
int idxSirInitial = sirNou [k] - 1 ;
int idxSirInitialPrec = sirNou [k - 1 ] - 1 ;
if (( idxSirInitial - idxSirInitialPrec == 1 ) || ( idxSirInitialPrec - idxSirInitial == 1 )) {
return false ;
}
}
return true ;
}
void tipar () {
for ( int i = 0 ; i < n - p; i++) {
cout << sirNou [i] << ' ' ;
}
cout << endl ;
}
void bt ( int k) {
if (k == n - p) {
tipar ();
return ;
}
for ( int i = 0 ; i < n; i++) {
if (!utilizat[i]) {
sirNou [k] = persoane[i];
utilizat[i] = true ;
if ( valid (k)) {
bt (k + 1 );
}
utilizat[i] = false ;
}
}
}
int main () {
cout << " Introduceti numarul de persoane (n): " ;
cin >> n;
cout << " Introduceti numarul de persoane eliminate (p): " ;
cin >> p;
for ( int i = 0 ; i < n; i++) {
persoane[i] = i + 1 ;
}
bt ( 0 );
return 0 ;
}