Sei sulla pagina 1di 8

MATRICE

Tipul tablou

tip nume[dim1][dim2][dimk]
tip nume[dim]; =>vector
tip nume[dim1][dim2]; => matrice
Obs:
- toate elementele sunt de acelasi tip = numit tipul de baza (tip)
- spatiul de memorie ocupat = sizeof(tip)*dim1*dim2**dimk
- se aloca spatiu de memorie pentru componenta de pe pozitia 0 (zero)
Matrice= un vector in care fiecare componenta este un vector
Ex:
a[20][50], n, m;
a = matrice = vector cu maxim 20 de componente fiecare fiind un vector cu
maxim 50 de numere intregi
((..max 50 val..),(..maxim 50 val..),..(maxim 50 de valori..)) sunt max 20 de
vectori
accesul la o componenta: nume[indice1][indice2], 0<=indice1<dim1;
0<=indice2<dim2
n=dim1
m=dim2 valori reale
a[0][0]
a[1][0]

a[n-1][0]

a[0][1]
a[1][1]
a[n-1][1]

a[n-1][2]

a[0][2]
a[1][2]

a[0][m-1]
a[1][m-1]

a[n-1][m-1]

a[i][j] = valoare situata la intersectia liniei i cu coloana j


!!!
i = indice de linie (primul indicator)
j=indice de coloana (al doilea)
Obs:
- nr de valori dintr-o matrice cu n linii si m coloane = n*m
- pe linia i sunt coloane
for(j=1; j<=m; j++) a[i][j]
linia i
- pe coloana j sunt linii
for(i=1; i<=n; i++) a[i][j]
coloana j

ex valori de pe linia 5: a[5][1], a[5][2]


ex de valori de pe coloana 7: a[1][7], a[2][7]

1. Citirea unei matrice:


- tastatura:
int a[50][50], n, m, i, j;
cin>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
cout<<a[<<i<<][<<j<<]=;
cin>>a[i][j];
}
- fisier
ifstream f(mat.in);
f>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
f>>a[i][j];
2. Afisarea unei matrice:
#include<iomanip>
setw(dim) = seteaza nr de caractere necesare scrierii dim si face alinierea la
dreapta
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
cout<<setw(4)<<a[i][j];
cout<<endl;
}
3. Prelucrarea valorilor unei matrice:
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
a[i][j]
i=1
i=2

j=1, 2, 3, 4, , m (a[1][1], a[1][2], )


j=1, 2, 3, 4, , m (a[2][1], a[2][2], )

prelucrarea pe linii si coloane (de sus in jos si pe fiecare linie de la stanga la


dreapta)

- se cere prelucrarea pe coloane linii


for(j=1; j<=m; j++)
for(i=1; i<=n; j++)

MATRICI PATRATICE
-

nr de linii = numarul de coloane


nr de valori = n*n
1. Diagonala principala
a[1][1], a[2][2], a[3][3], .. a[n][n] - n valori
for(i=1; i<=n; i++)
a[i][i]
parcurgerea pe linii de sus
for(
a[n-j+1][j]
parcurgerea pe coloane de la stanga la dreapta
2. Diagonala secundara

a[1][n] , a[2][n-1], a[3][n-2] a[n][1]


1+n, 2+n-1 = n+1, 3+n-2=n+1, n+1
a[i][j] apartine DS i+j = n+1 => j=n-i+1
for (i=1; i<=n; i++)
a[i] [n-i+1]

3. Deasupra DP
i=1 (linia 1) => j=2, 3, 4, 5, , n
i=2
j=2, 4, n
i=3
=> j=4, 5,n
linia i: a[i][1] a[i][2]. a[i][i-1] a[i][i] a[i][i+1]. a[i][n]
for(i=1; i<n; i++)
for(j=i+1; j<=n; j++)
a[i][j]

4. Sub DP
i=1
i=2 => j=1
i=3 => j=1, 2

i=4 => j=1, 2, 3


for(i=2; i<=n; i++)
for(j=1; j<=i-1; j++
a[i][j]
5. Deasupra DS
i=1 => j=1, 2, , n-1
i=2 => j=1, 2,, n-2

linia i: a[i][1].. a[i][n-i] a[i][n-i+1]

a[i][n-i+2]..a[i][n]

for(i=1; i<n; i++)


for(j=1; j<=n-i+1; j++)
a[i[j]
6. Sub DS
i=1
i=2 => j=n
i=3 => j= n-1, n

for(i=2; i<=n; i++)


for(j=n-i+2; j<=n; j++)
a[i][j]
for(i=2; i<=n; i++)
for(j
7. Zone delimitate de cele doua diagonale
7.1Zona Nord
Nord
linia i: a[i][1] a[i-1][i] a[i][i] a[i+1][i] a[i][n-i] a[i][n-i+1] a[i][n-i+2] a[i][n]
DP
DS

if(n%2==0) k=n/2+1
else k=n/2
i=1, k
i=1 => j=2,n-1
i=2 => j=3,n-2
i => j=i+1,n-i
for(i=1; i<=k; i++)
for(j=i+1; j<=n-i; j++)
a[i][j]
7.2Zona Sud

j = coloana aceeasi
i=1 (nord)
i=2
i=3
i+linia = n+1 =>

linia
linia
linia
linia

n
n-1
n-2
= n-i+1

for(i=1; i<=k; i++)


for(j=i+1; j<=n-i; j++)
a[n-i+1][j]
7.3Zona vest
i=1 linie nord --- rotatie stanga 90 grade =>
i=2
j=2

j=1 vest

for(j=1; j<=k; j++)


for(i=j+1; i<n-j; i++)
a[i][j]
7.4Zona est
j=1 (vest)
col n (est)
j=2
col n-1
j => col = n-j+1
for(j=1; j<=k; j++)
for(j=j+1; j<=n-j; j++)
a[i][n-j+1]
8. Simetrii in matrice patratice
8.1Simetrie fata de DP
n=6
a[1][2] = a[2][1]
a[3][4] = a[4][3]
a[i][j] = a[j][i]
int simetricDP
{
int i, j;
for(i=2; i<=n; i++)
for(j=1; j<i; j++)
if(a[i][j] != a[j][i]) return 0;
return 1;
}
8.2Simetrie fata de DS
n=6
a[1][5] = a[2][6] (a[1][n-1] = a[2][n])
a[2][4] = a[3][5] (a[2][n-2] = a[3][n-1]
a[i][j] = a[linie[coloana]

i+coloana = n+1
a+linie = n+1
ai][j] = a[linie][coloana]
int simetricDS
{
int i, j;
for(i=1; i<n; i++)
for(j=1; j<n-i+1; j++)
if(a[i][j] != a[n-j+1][n-i+1]) return 0;
return 1;
}
-

8.3Simetrie fata de Mediana orizontala


linia n/2+1 pentru n impar
imaginara intre linii n/2 si n/21+1 pentru n=par

int simetrieMO()
{
]int i, j;
for(i=1l i<=n/2; i++)
for(j=1; j<=n; j++)
if(a[i][j] != a[n-i+1][j]) return 0;
return 1;
}
8.4Simetrie fata de Mediana verticala
int simetrieMV()
{
]int i, j;
for(i=1l i<=n; i++)
for(j=1; j<=n/2; j++)
if(a[i][j] != a[i][n-j+1]) return 0;
return 1;
}

VECTORI DE DIRECTIE
Problema vecinilor lui a[i][j]
a[i-1][j-1]
a[i-1][j]
a[i-1][j+1]
a[i][j-1]
a[i][j]
a[i][j+1]
a[i+1][j-1]
a[i+1][j]
a[i+1][j+1]
1. Cazul 4 vecini

a[i][j-1]

***
a[i-1][j]
a[i][j]

a[i][j+1]

a[i+1][j]
int dx[4]={-1, 0, 1, 0}
int dy[4]={0, 1, 0, -1}
ATENTIE: vectorii de directie se initializeaza in pozitia 0
for(k=0; k<4; k++)
a[i+dx[k]][j+dy[k]]
for(k=0; k<=4; k++)
{
X=i+dx[k];
Y=j+dy[k];
a[X][Y];
}
dx[5]={0, -1, 0, 1, 0}; dy[5]={0, 0, 1, 0, -1}
for(k=0; k<=4; k++)
{
X=i+dx[k];
Y=j+dy[k];
a[X][Y];
}

2. Cazul 8 vecini
a[i-1][j-1]
a[i][j-1]
a[i+1][j-1]

***
a[i-1][j]
a[i][j]
a[i+1][j]

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

dx[8]={-1, -1, 0, 1, 1, 1, 0, -1}


dy[8]={0, 1, 1, 1, 0, -1, -1, -1}
for(k=0; k<=4; k++)
{
X=i+dx[k];
Y=j+dy[k];
a[X][Y];
}

3. Cazul 8 vecini pentru calul de pe tabla de sah


***

a[i-2][j-1]

a[i-2]
[j+1]

a[i-1][j-2]

a[i-1]
[j+2]
a[i][j]

a[i+1][j2]

a[i+1]
[j+2]
a[i+2][j1]

a[i+2]
[j+1]

dx[8]={-2, -1, 1, 2, 2, 1, -1, -2}


dy[8]={1, 2, 2, 1, -1, -2, -2, -1}

BORDAREA UNEI MATRICI CU O VALOARE CONFORM


CERINTELOR PROBLEMEI
ex:
-

problema labirintului
codificare:
a[i][j] = 1 daca este perete
= 0 daca este liber

linia 0, coloana 0, linia n+1, coloana n+1


for(i=0; i<=n+1; i++)
a[i][0]=a[0][1]=a[i][n+1]=a[n+1][i]=1
Verificare daca (x, y) sunt in matrice
int intereiorA(int x, int y)
{
if(x>=1 && x<=n && y>=1 && y<=n)
return 1;
return 0;
}
int interiorB(int x, int y)
{
return (x>=1 && x<=n && y>=1 && y<=n);
}
Apelul:
if(interiorA(x, y)==1)
if(interiorB(x, y)!=0)

Potrebbero piacerti anche