online: 2; azi: 457; total: 52463 Manual clasa a xi a - Tehnici de programare - Divide et impera

Manual clasa a Xi a

Tehnici de programare

Divide et impera

Într o matrice pătrată cu dimensiunea n să se interschimbe diagonala principală cu diagonala secundară.
Putem utiliza algoritmul Divide et Impera pentru a interschimba diagonala principală cu diagonala secundară într-o matrice pătrată de dimensiunea n. Algoritmul constă în împărțirea problemei în subprobleme mai mici, calcularea soluției pentru fiecare subproblemă și combinația soluțiilor pentru a obține soluția finală.
În cazul de față, putem împărți matricea în patru submatrice și interschimba diagonala principală cu diagonala secundară pentru fiecare submatrice prin apelul recursiv al funcției. Apoi, putem combina cele patru submatrice pentru a obține matricea finală cu diagonala principală și diagonala secundară interschimbate.
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 matricea cu diagonala principală și secundară interschimbate.
# include < iostream >
using namespace std ;
void swapDiagonal ( int a[][ 100 ], int n, int rStart , int rEnd , int cStart , int cEnd ) {
if ( rStart > rEnd || cStart > cEnd ) {
return ;
}
for ( int i = rStart , j = cStart ; i <= rEnd && j <= cEnd ; i++, j++) {
swap (a[i][j], a[i][n - j - 1 ]);
}
int rMid = ( rStart + rEnd ) / 2 ;
int cMid = ( cStart + cEnd ) / 2 ;
swapDiagonal (a, n, rStart , rMid , cStart , cMid );
swapDiagonal (a, n, rStart , rMid , cMid + 1 , cEnd );
swapDiagonal (a, n, rMid + 1 , rEnd , cStart , cMid );
swapDiagonal (a, n, rMid + 1 , rEnd , cMid + 1 , cEnd );
}
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[ 100 ][ 100 ];
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cout << "a[" << i << "][" << j << "] = " ;
cin >> a[i][j];
}
}
swapDiagonal (a, n, 0 , n - 1 , 0 , n - 1 );
// Afisarea matricei cu diagonala principala si diagonala secundara interschimbate
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cout << a[i][j] << " " ;
}
cout << endl ;
}
return 0 ;
}