online: 3; azi: 792; total: 52798 Manual clasa a ix a - Implementarea structurilor de date - Structuri de date

Probleme Rezolvate



Manual clasa a IX a

Implementarea structurilor de date

Structuri de date

Se consideră o matrice patrata a cu dimensiunea nxn (n impar ) si un vector v cu nxn elemente . Numarul n si elementele matricei se citesc de la tastatura . Sa se copieze in vectorul belementele matricei a parcurse
Pentru a copia elementele matricei a în vectorul v parcurgând matricea linie cu linie, putem folosi un algoritm elementar care parcurge fiecare element al matricei și îl copiază în vectorul v la poziția corespunzătoare. Astfel, pentru o matrice de dimensiune n , elementul de pe linia i și coloana j se va afla la poziția (i-1)*n + j-1 în vectorul v .
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[n][n];
cout << " Introduceti elementele matricei:\n" ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> a[i][j];
}
}
int v[n*n];
int k = 0 ; // contor pentru a numara cate elemente am copiat in vectorul v
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
v[k] = a[i][j];
k++;
}
}
cout << "Elementele copiate in vectorul v sunt:\n" ;
for ( int i = 0 ; i < n*n; i++) {
cout << v[i] << " " ;
}
cout << endl ;
return 0 ;
}
În acest cod, se citește dimensiunea matricei n și elementele matricei a , se parcurge matricea și se copiază elementele în vectorul v . Ulterior, se afișează elementele copiate în vector.
b) coloană cu coloană
Pentru a copia elementele matricei a în vectorul v coloană cu coloană, putem folosi următorul algoritm:
# include < iostream >
using namespace std ;
int main () {
int n;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
int a[n][n];
int v[n*n];
// Citim elementele matricei
cout << " Introduceti elementele matricei:\n" ;
for ( int i = 0 ; i < n; i++) {
for ( int j = 0 ; j < n; j++) {
cin >> a[i][j];
}
}
// Copiem elementele coloanelor matricei in vectorul v
int k = 0 ; // index in vectorul v
for ( int j = 0 ; j < n; j++) { // parcurgem coloanele
for ( int i = 0 ; i < n; i++) { // parcurgem elementele coloanei j
v[k] = a[i][j]; // copiem elementul a[i][j] in v[k]
k++; // trecem la urmatorul element din vectorul v
}
}
// Afisam elementele vectorului v
cout << "Elementele vectorului v sunt:\n" ;
for ( int i = 0 ; i < n*n; i++) {
cout << v[i] << " " ;
}
cout << endl ;
return 0 ;
}
Această soluție poate fi adaptată și pentru a copia elementele matricei linie cu linie, înlocuind parcurgerea coloanelor cu parcurgerea liniilor în bucla exterioară și parcurgerea elementelor liniilor în bucla interioară.
c) în spirală ( pornind de la elementul a[0][0] în sens invers trigonometric).
# include < iostream >
using namespace std ;
const int MAX = 100 ;
int main () {
int n, a[MAX][MAX], b[MAX*MAX], cnt = 0 ;
cout << " Introduceti dimensiunea matricei: " ;
cin >> n;
cout << " Introduceti elementele matricei: \n" ;
for ( int i = 0 ; i < n; i++)
for ( int j = 0 ; j < n; j++)
cin >> a[i][j];
int startRow = 0 , endRow = n -1 , startCol = 0 , endCol = n -1 ;
while ( startRow <= endRow && startCol <= endCol ) {
for ( int i = endCol ; i >= startCol ; i--)
b[ cnt ++] = a[ endRow ][i];
for ( int i = endRow -1 ; i >= startRow ; i--)
b[ cnt ++] = a[i][ startCol ];
if ( startRow != endRow ) {
for ( int i = startCol+ 1 ; i <= endCol ; i++)
b[ cnt ++] = a[ startRow ][i];
}
if ( startCol != endCol ) {
for ( int i = startRow+ 1 ; i < endRow ; i++)
b[ cnt ++] = a[i][ endCol ];
}
startRow ++;
endRow --;
startCol ++;
endCol --;
}
cout << "Elementele matricei parcurse in spirala sunt: \n" ;
for ( int i = 0 ; i < cnt ; i++)
cout << b[i] << " " ;
return 0 ;
}

Codul dat anteror este o implementare a algoritmului pentru parcurgerea matricei în spirală (în sens invers trigonometric), pornind de la elementul a[0][0].
Inițializăm variabilele rStart (prima linie), rEnd (ultima linie), cStart (prima coloană) și cEnd (ultima coloană) cu valorile 0 și n-1, respectiv, unde n este dimensiunea matricei. Acestea vor fi actualizate de fiecare dată când trecem prin toate elementele corespunzătoare unei linii/coloane.
În while loop , parcurgem elementele matricei în funcție de poziția curentă și direcția de parcurgere. Direcția se schimbă atunci când ajungem la ultimul element al rândului/coloanei curente sau când ajungem la un element deja vizitat. În acest caz, actualizăm și valorile rStart , rEnd , cStart și cEnd .
La fiecare pas, adăugăm elementul curent în vectorul result . După ce am parcurs toate elementele matricei, returnăm vectorul result .
Astfel, implementarea dată permite parcugerea elementelor matricei în spirală, în sens invers trigonometric, și reținerea acestora într-un vector.