Sunteți pe pagina 1din 3

Lectia nr.

10 Centru HaiLaOlimpiada Vaslui

Algoritmi specifici tipului de date tablou bidimensional


Un tablou cu două dimensiuni se numește matrice .
Declarare
int a[50][100]
int n,m,i,j;
Am declarat:
- o matrice cu maxim 50 de linii și 100 de coloane, numerotarea se face de la 0
- n- numărul efectiv de linii;
- m-numărul efectiv de coloane;
- i- contor pentru linie
- j- contor pentru coloane
Citire:
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
Afisare:
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<a[i][j]<<" ";
cout<<"\n";
}
Obs. Putem numerota liniile și colonele de la 1, în acest caz adăugăm 1 la numărul maxim de linii
și 1 la numărul maxim coloane .
Ex: int a[51][101];
Citire:
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
Afisare:
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<"\n";
}
Lectia nr. 10 Centru HaiLaOlimpiada Vaslui

II. Prelucrarea matricelor


În general prelucrarea unei matrice presupune accesarea și prelucrarea fiecărei componente a sa în
parte. Pentru a accesa componentele matricei este necesară parcurgerea (traversarea) sa. Matricea
poate fi traversata pe linii și pe coloane, pe coloane si pe linii sau în alt mod particular.
Parcurgere Linie cu linie int a[100][100], n, m;
cin>>n>>m;
Vom utiliza doua variabile pentru a accesa elementele for(int i=0;i<n;i++)
matricei (i pentru linii și j pentru coloane). for(int j=0;j<m;j++)
//prelucrez a[i][j];
Sunt parcurse elementele aflate pe prima linie de la
stânga la dreapta, apoi pe cea de a doua și așa mai
departe.
Coloană cu coloană int a[100][100], n, m;
cin>>n>>m;
Sunt parcurse elementele aflate pe prima coloană de for(int j=0;j<m;j++)
sus în jos, apoi pe cea de a doua și așa mai departe. for(int i=0;i<n;i++)
//prelucrez a[i][j];

Matrice patratica
Într-o matrice pătratică numărul de linii= numărul de coloane (n=m).

Într-o matrice pătratică avem:

Diagonala principala
elementele a[i][i], cu i=1,n
sau a[i][i], cu i=0,n-1

Diagonala secundara
elementele a[i][n-i+1], i=1,n
sau a[i][n-i-1], i=0,n-1
Lectia nr. 10 Centru HaiLaOlimpiada Vaslui

Zonele determinate de diagonale:


I.
Pe diagonala principală i=j
Sub diagonala principala: i>j
Deasupra diagonalei principale: i<j
II.
Pe diagonala secundară j+i=n1
Sub diagonala secundara: j+i>n-1
Deasupra diagonalei secundare: j+i<n-1

Zonele:
N: i<j si j+i<n-1
E: i<j si j+i>n-1
S: i>j si j+i>n-1
E: i>j si j+i<n-1

Vecinii unui element din matrice


NV N NE
a[i-1][j-1] a[i-1][j] a[i-1][j+1]

V E
a[i][j]
a[i][j-1] a[i][j+1]

SV S SE
a[i+1][j-1] a[i+1][j] a[i+1][j+1]

Un element din matrice, în funcție de poziția sa, are 3, 5 sau 8 vecini. Pentru a nu verifica
poziția elementului, se brodează matricea (cu o valoare dependentă de problema care se rezolvă,
se adaugă o linie sus, o linie jos, o coloană la stânga, o coloană la dreapta), astfel toate elementele
vor avea 8 vecini. Deplasarea se va face cu ajutorul a doi vectori care indică poziția relativă a unui
vecin față de elementul a[i][j].

int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1, 1,1,0,-1,-1,-1};
int k; //afisam vecinii
for (k=0; k<8; k++)
cout<<a[i+dx[k]][y+dy[k]]<<’\n’;

Observație:În unele probleme ne putem deplasa numai pe linie și pe coloană, vom avea in acest
caz numai 4 vecini (N, E, S, V)
Probleme de rezolvat:
Aplicații campion: balcon, matrice4, robinson , furnica, copaci1
Pbinfo: pe site

S-ar putea să vă placă și