online: 4; azi: 940; total: 51395 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Se consideră n cuburi. Fiecare cub i are latura L; şi culoarea ci. Să se construiască toate tumurile stabile, formate cu m cuburi, astfel încât două cuburi vecine în turn să nu aibă aceeaşi culoare. Valorile pentru n şi m şi atributele celor n cuburi se citesc de la tastatură. Indicație. Informațiile despre cuburi se memorează într-un vector de înregistrări cu n elemente. Soluţia are m elemente. Un element al soluției este indicele din vector al unui cub. Se generează aranjamente cu condiţie de n obiecte luate câte m — soluția conţine o condiție internă suplimentară față de cea impusă de aranjamente: cubul k care se adaugă la turn trebuie să aibă latura mai mică decât a cubului k-1 şi culoarea diferită de aceasta.
# include < iostream >
using namespace std ;
struct Cub {
int latura;
string culoare;
};
int n, m;
Cub cuburi[ 100 ];
int aranjament[ 100 ];
bool utilizat[ 100 ];
bool valid ( int k) {
if (k > 0 ) {
// Verifică dacă cubul k are latura mai mică decât cubul k-1 și culoarea diferită
if (cuburi[aranjament[k]].latura >= cuburi[aranjament[k - 1 ]].latura ||
cuburi[aranjament[k]].culoare == cuburi[aranjament[k - 1 ]].culoare) {
return false ;
}
}
return true ;
}
void tipar () {
for ( int i = 0 ; i < m; i++) {
cout << '(' << cuburi[aranjament[i]].latura << ", " << cuburi[aranjament[i]].culoare << ") " ;
}
cout << endl ;
}
void bt ( int k) {
if (k == m) {
tipar ();
return ;
}
for ( int i = 0 ; i < n; i++) {
if (!utilizat[i]) {
aranjament[k] = i;
utilizat[i] = true ;
if ( valid (k)) {
bt (k + 1 );
}
utilizat[i] = false ;
}
}
}
int main () {
cout << " Introduceti numarul de cuburi (n): " ;
cin >> n;
cout << " Introduceti numarul de cuburi in turn (m): " ;
cin >> m;
for ( int i = 0 ; i < n; i++) {
cout << " Introduceti latura si culoarea cubului " << i + 1 << ": " ;
cin >> cuburi[i].latura >> cuburi[i].culoare;
}
bt ( 0 );
return 0 ;
}

Exemplu de date de intrare:
Introduceti numarul de cuburi (n): 6
Introduceti numarul de cuburi in turn (m): 3
Introduceti latura si culoarea cubului 1: 6 rosu
Introduceti latura si culoarea cubului 2: 5 albastru
Introduceti latura si culoarea cubului 3: 4 verde
Introduceti latura si culoarea cubului 4: 3 rosu
Introduceti latura si culoarea cubului 5: 2 albastru
Introduceti latura si culoarea cubului 6: 1 verde