Sunteți pe pagina 1din 7

Matrice patratice

O matrice in care numarul de linii este egal cu numarul de coloane se numeste matrice
patratica. O astfel de matrice este caracterizata de existenta a doua diagonal, diagonala principal
si diagonala secundara. In matricea de mai jos am evidentiat cele doua diagonale.

0 1 2 3 4 5
0 X X
1 X X
2 X X
3 X X
4 X X
5 X X

Elementele de pe diagonala principala au coordonatele:

0, 0 1, 1 2, 2 3, 3 4, 4 5, 5

Se observa ca linia si coloana au aceeasi valoare, deci i == j.

Elementele de pe diagonala principala au coordonatele:

0, 5 1, 4 2, 3 3, 2 4, 1 5, 0

Se observa ca suma dintre linie si coloana este mereu 5, adica i + j == n - 1.

Afisati elementele de pe diagonala principala a unei matrice.

#include<iostream>
#include<fstream>
using namespace std;

ifstream fin("build.txt");

void ReadMatrix(int &n, int a[100][100])


{
int i, j;
fin >> n;//citescx numarul de linii si de coloane
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
fin >> a[i][j];
}

void Solve(int n, int a[100][100])


{
int i;
for(i = 0; i < n; i++)
cout << a[i][i] << " ";
}

int main()
{
int n, a[100][100];
ReadMatrix(n, a);
Solve(n, a);
}
Afisati suma elementelor de deasupra diagonalei principale a unei matrice.

int SumV1(int n, int a[100][100])


{
int i, j, s = 0;
for(i = 0; i < n; i++)
for(j = i + 1; j < n; j++)
s = s + a[i][j];
return s;
}

int SumV2(int n, int a[100][100])


{
int i, j, s = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(i < j)
s = s + a[i][j];
return s;
}

Afisati elementele de pe diagonala secundara a unei matrice.

#include<iostream>
#include<fstream>
using namespace std;

ifstream fin("build.txt");

void ReadMatrix(int &n, int a[100][100])


{
int i, j;
fin >> n;//citesc numarul de linii si de coloane
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
fin >> a[i][j];
}

void Solve(int n, int a[100][100])


{
int i;
for(i = 0; i < n; i++)
cout << a[i][n - i - 1] << " ";
}

int main()
{
int n, a[100][100];
ReadMatrix(n, a);
Solve(n, a);
}

Afisati suma elementelor de sub diagonala secundara a unei matrice.

int SumV1(int n, int a[100][100])


{
int i, j, s = 0;
for(i = 0; i < n; i++)
for(j = n - i; j < n; j++)
s = s + a[i][j];
return s;
}

int SumV2(int n, int a[100][100])


{
int i, j, s = 0;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(i + j > n - 1)
s = s + a[i][j];
return s;
}

Se observa ca cele doua diagonale determina patru zone in matrice: N, S, V, E.

0 1 2 3 4 5
0 X N X
1 X X
2 X X
V E
3 X X
4 X X
5 X S X

Astfel conditiile pentru ca un element:


- sa faca parte din N sunt ca i < j si i + j < n – 1;
- sa faca parte din E sunt ca i < j si i + j > n – 1;
- sa faca parte din S sunt ca i > j si i + j > n - 1
- sa faca parte din V sunt ca i > j si i + j < n - 1
Tema.
1. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2<n<16),
construieşte în memorie şi afişează pe ecran o matrice cu n linii şi n coloane în care elementele
de pe cele două diagonale sunt egale cu 0, elementele care se află deasupra ambelor diagonale
sunt egale cu 1, elementele care se află sub ambele diagonale sunt egale cu 2, iar restul
elementelor sunt egale cu 3. Elementele matricei vor fi afişate pe ecran, câte o linie a matricei
pe câte o linie a ecranului cu câte un spaţiu între elementele fiecărei linii.

Exemplu: pentru n=5 se va afişa matricea 0 1 1 1 0


alăturată. 30103
33033
30203
02220

2. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2≤n≤24) şi


construieşte în memorie o matrice cu n linii şi n coloane ale cărei elemente vor primi valori
după cum urmează:
- elementele aflate pe diagonala principală a matricei vor primi valoarea 0
- elementele de pe prima coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea n
- elementele de pe a doua coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea n-1
...
- elementele de pe ultima coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea 1
Programul va afişa matricea astfel construită pe ecran, câte o linie a matricei pe câte o linie a
ecranului, cu câte un spaţiu între elementele fiecărei linii (ca în exemplu).
Exemplu: pentru n=4 se va afişa matricea 0 3 2 1
alăturată. 4021
4301
4320

3. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2≤n≤24) şi


construieşte în memorie o matrice cu n linii şi n coloane ale cărei elemente vor primi valori
după cum urmează:
- elementele aflate pe diagonala secundară a matricei vor primi valoarea 0
- elementele de pe prima linie, cu excepţia celui aflat pe diagonala secundară vor primi valoarea
n
- elementele de pe a doua linie, cu excepţia celui aflat pe diagonala secundară vor primi
valoarea n-1
...
- elementele de pe ultima linie, cu excepţia celui aflat pe diagonala secundară vor primi
valoarea 1
Programul va afişa matricea astfel construită pe ecran, câte o linie a matricei pe câte o linie a
ecranului, cu câte un spaţiu între elementele fiecărei linii (ca în exemplu).

Exemplu: pentru n=4 se va afişa matricea 4 4 4 0


alăturată. 3303
2022
0111

Indicatie. Pentru problemele 2 si 3 se va folosi observatia ca matricele sun simetrice fata de


diagonala principala, respectiv secundara.

4. Scrieti un program C/C++ care citeste de la tastatură un număr natural n (n[3,50]) și


construiește în memorie un tablou bidimensional cu n linii si n coloane, astfel încât fiecare
element aflat pe diagonala secundară a sa, precum și elementele vecine aflate pe aceeași linie
cu el, pe coloana din stânga, respectiv pe coloana din dreapta sa, dacă există, au valoarea 1, iar
toate celelalte elemente ale tabloului au valoarea 2, ca în exemplu. Programul afisează pe ecran
tabloul obținut, câte o linie a tabloului pe câte o linie a ecranului, elementele fiecărei linii fiind
separate prin câte un spatiu.

Exemplu: pentru n=7 se va afişa matricea 2 2 2 2 2 1 1


alăturată. 2222111
2221112
2211122
2111222
1112222
1122222

5. Variabilele i şi j sunt de tip întreg, iar variabila a memorează un tablou bidimensional cu 5


linii şi 5 coloane, numerotate de la 1 la 5, având iniţial toate elementele nule. Fără a utiliza alte
variabile decât cele menționate, scrieţi secvenţa de instrucţiuni de mai jos, înlocuind punctele
de suspensie astfel încât, în urma executării secvenţei obţinute, variabila a să memoreze tabloul
alăturat.

for(i=1;i<=5;i++) 44444
for(j=1;j<=5;j++) 43333
.................. 43222
43211
43210
BONUS – SUBMATRICE

Se citeste o matrice patratica cu n linii si n coloane (n<=100) cu elemente numere intregi din
intervalul [-1000,1000]. Calculati si afisati suma maxima a unei submatrici care are coltul
stanga-sus si coltul dreapta-jos pe diagonala principala a matricii date.
Afisati pe linia urmatoare submatricea de suma maxima.
Exemplu:

matrice.in matrice.out
5 17
1 2 -3 4 5 0 -1 5
2 0 -1 5 -9 3 9 -8
-8 3 9 -8 -4 234
1 2 3 4 -1
-8 7 6 5 -13

#include <fstream>
using namespace std;
ifstream fin("matrice.in");
ofstream fout("matrice.out");

int main()
{
int A[101][100],n,smax=-100000000,imax,jmax;
fin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
fin>>A[i][j];
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int s=0;
for(int x=i;x<=j;x++)
for(int y=i;y<=j;y++)
s=s+A[x][y];
if(s>smax)
{
smax=s;
imax=i;
jmax=j;
}
}
fout<<smax<<endl;
for(int i=imax;i<=jmax;i++)
{
for(int j=imax;j<=jmax;j++)
fout<<A[i][j]<<" ";
fout<<endl;
}
return 0;
}

Tema.
1. Numim pătrat de dimensiune m al unui tablou bidimensional tabloul obținut din acesta
păstrând doar elementele aflate pe primele m linii şi pe primele m coloane ale sale. Scrieţi un
program C/C++ care citeşte de la tastatură un număr natural, n (nÎ[2,20]), apoi elementele unui
tablou bidimensional cu n linii şi n coloane, numere naturale din intervalul [0,104]. Programul
determină un pătrat de dimensiune maximă al tabloului citit, cu toate elementele egale, și
afișează pe ecran valoarea acestei dimensiuni.
Exemplu: pentru n=5 și tabloul alăturat, se 2 2 2 2 2
afişează pe ecran 3. 22228
22222
21287
35212

2. https://www.pbinfo.ro/?pagina=probleme&id=2479
3. https://www.pbinfo.ro/?pagina=probleme&id=2625

BONUS – ALGORITMUL LUI LEE

Este un algoritm in care se pleaca dintr-un punct al unei matrice si se ajunge in alt punct
al unei matrice intr-un numar minim de miscari. Eficient el se realizeaza folosind o structura
de tip coada asa cum vom arata intr-un material care va urma.

Un soricel se afla intr-un labirint reprezentat de o matrice pe pozitia startl, startc si incearca sa
ajunga dintr-un numar minim de miscari in pozitia final, finalc. Soricelul nu poate atinge
anumite celule ale matricei in care se afla pisici. Aceste celule vor contine -1, in timp ce toate
celelalte celule vor fi 0. Soricelul se poate misca pe toate cele 8 directii posibile(vezi materialul
2 cu matrice).
Afisati harta miscarilor soricelului precum si care este numarul minim de miscari prin care
ajunge la pozitia finala.

0 0 0 0 -1 0
0 0 -1 0 finall, finalc 0
0 0 0 0 0 0
0 0 0 0 -1 0
startl, startc 0 0 0 0 0
0 -1 0 0 0 0

#include<iostream>
#include<fstream>
using namespace std;

ifstream fin("lee.txt");
//declar pozitiile in care se poate deplasa soarecele din pozitia i, j
//adica sus, pe diagonala dreapta sus, dreapta, pe diagonala dreapta jos
//jos, pe diagonala stanga jos, stanga, pe diagonala stanga sus
int dl[] = { -1, -1, 0, 1, 1, 1, 0 };
int dc[] = { 0, 1, 1, 1, 0, -1, -1 };

void ReadMatrix(int &n, int a[100][100])


{
int i, j;
fin >> n;
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
fin >> a[i][j];
}

void WriteMatrix(int n, int a[100][100])


{
int i, j;
for(i = 0; i <= n + 1; i++)
{
for(j = 0; j <= n + 1; j++)
cout << a[i][j] << " ";
cout << endl;
}
}
//bordez matricea pe margini cu -1 pentru a nu putea sa ies din matrice
void BorderMatrix(int n, int a[100][100])
{
int i;
for(i = 0; i <= n + 1; i++)
a[0][i] = a[i][0] = a[n + 1][0] = a[0][n + 1] = -1;
}

//atunci cand ajunge la destinatie elementul nu va mai fi 0


int Final(int finall, int finalc, int a[100][100])
{
return a[finall][finalc] !=0;

/*sau
if(a[finall][finalc] !=0)
return 1;
else
return 0;
*/
}

void Lee(int n, int a[100][100], int startl, int startc, int finall, int finalc)
{
int i, j, k, valoare = 1;
a[startl][startc] = valoare;
while(Final(finall, finalc, a) == 0)
{
for(i = 0; i < n; i++)
for(j = 0; j < n; j++)
if(a[i][j] == valoare)//daca identific un punct in care a ajuns soricelul
for(k = 0; k < 8; k++)//incerc sa vad unde poate ajunge soricelul
if(a[i + dl[k]][j + dc[k]] == 0)//daca nu a mai fost in
punctul in care poate ajunge
a[i + dl[k]][j + dc[k]] = valoare + 1;//il completez
valoare++;//pregatesc urmatoarea miscare a soricelului

}
}

int main()
{
int a[100][100], n, startl, startc, finall, finalc;
//Introduc manual pozitia initiala si finala a soricelului
startl = 5; startc = 1;
finall = 2; finalc = 5;
//citesc matricea
ReadMatrix(n, a);
//bordez matricea
BorderMatrix(n, a);
//Generez miscarile soricelului
Lee(n ,a, startl, startc, finall, finalc);
//Afisez matricea completata
WriteMatrix(n, a);
}

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