online: 11; azi: 573; total: 52579 Manual clasa a xi a - Tehnici de programare - Divide et impera

Manual clasa a Xi a

Tehnici de programare

Divide et impera

Să se determine simultan valoarea minimă şi valoarea maximă, dintr-o matrice cu n linii si m coloane.
Pentru a determina simultan valoarea minimă și valoarea maximă dintr-o matrice cu n linii și m coloane, putem utiliza o abordare Divide et Impera similară cu cea utilizată pentru problema găsirii celui mai mare element dintr-un vector.
Putem împărți matricea în patru submatrice și să calculăm valoarea minimă și valoarea maximă pentru fiecare submatrice prin apelul recursiv al funcției. Apoi, putem combina cele patru valori pentru a obține valoarea minimă și valoarea maximă pentru matricea întreagă.
Pentru a implementa acest algoritm în C++, putem utiliza o funcție recursivă care primește matricea sub formă de vector bidimensional, dimensiunea matricei n și indicii de început și sfârșit al intervalului de evaluare pe linii și coloane. Funcția va returna un vector cu două elemente, primul reprezentând valoarea minimă, iar al doilea reprezentând valoarea maximă.
#include < iostream >
using namespace std ;
const int MAX_VALUE = 2147483647 ;
const int MIN_VALUE = - 2147483648 ;
int * minMax ( int a [][100] , int n, int rStart , int rEnd , int cStart , int cEnd ) {
int * result = new int [2] ;
if ( rStart == rEnd && cStart == cEnd ) {
result [0] = a [ rStart ][ cStart ] ;
result [1] = a [ rStart ][ cStart ] ;
return result ;
}
int rMid = ( rStart + rEnd ) / 2 ;
int cMid = ( cStart + cEnd ) / 2 ;
int * minMax1 = minMax ( a , n, rStart , rMid , cStart , cMid );
int * minMax2 = minMax ( a , n, rStart , rMid , cMid + 1 , cEnd );
int * minMax3 = minMax ( a , n, rMid + 1 , rEnd , cStart , cMid );
int * minMax4 = minMax ( a , n, rMid + 1 , rEnd , cMid + 1 , cEnd );
result [0] = MAX_VALUE;
result [1] = MIN_VALUE;
result [0] = min( result [0] , min(minMax1 [0] , min(minMax2 [0] , min(minMax3 [0] , minMax4 [0] ))));
result [1] = max ( result [1] , max ( max (minMax1 [1] , minMax2 [1] ), max (minMax3 [1] , minMax4 [1] )));
delete [] minMax1;
delete [] minMax2;
delete [] minMax3;
delete [] minMax4;
return result ;
}
int main () {
int n, m;
cout << " Introduceti numarul de linii: ";
cin >> n;
cout << " Introduceti numarul de coloane: ";
cin >> m;
int a[100][100];
for ( int i = 0; i < n; i++) {
for ( int j = 0; j < m; j++) {
cout << " a[ " << i << " ][ " << j << " ] = ";
cin >> a[i][j];
}
}
int * result = minMax (a, n, 0, n - 1, 0, m - 1);
cout << " Valoarea minima este " << result [0] << endl ;
cout << " Valoarea maxima este " << result [1] << endl ;
delete [] result ;
return 0;
}