Nu obții 100 de puncte sau ai nelămuriri în privința problemelor? Scrie-mi pe Instagram.
Ai găsit o greșeală, vrei să raportezi un utilizator sau vrei să comunici altceva? Folosește formularul de contact.
Vrei să ne transmiți o părere despre platformă? Folosește formularul de feedback.
Folosește următoarele shortcuturi pentru a naviga mai ușor pe platformă.
Meniu shortcuturi | ? |
Căutare probleme sau utilizatori | / |
Navigare printre rezultatele căutării | ↑, ↓ |
Meniu de contact și feedback | CTRL + Shift + F |
Ieșire din meniuri | Esc |
Setări editor | CTRL + Shift + S |
Schimbare stil editor | CTRL + Shift + E |
Șabloane de cod | CTRL + Shift + 1/2/3 |
Golire editor | CTRL + Shift + 4 |
Am învățat până acum să lucrăm cu variabile individuale, sau chiar să lucrăm cu vectori — în care stocăm un număr de variabile de același tip, într-o linie.
În C++, matricele extind vectorii în 2D — de unde vine și numele de tablou bidimensional. Mai exact, într-o matrice, elementele sunt organizate pe linii și pe coloane.
Spre exemplu, iată o matrice de dimensiuni 3 × 4
:
Dă hover pe un element pentru a-i găsi linia și coloana.
Ne reamintim că la vectori, puteam să luăm câte un element folosind indicele său — practic folosind poziția din vector. La matrici, ne vom folosi de 2
indici: unul care numește linia, și celălalt care numește coloana elementului curent.
Declararea unei matrice constă în specificarea celor două dimensiuni: numărul maxim de linii și numărul maxim de coloane.
tip nume[numarLinii][numarColoane];
Spre exemlu, o matrice de numere cu 3
linii și 4
coloane se declară astfel:
int a[3][4];
Și poate fi reprezentată așa (elementele sunt alese aleatoriu):
Observăm următoarele lucruri:
3 * 4 = 12
elemente; o matrice cu n
linii și m
coloane are n * m
elemente;0
la 2
. Coloanele sunt indexate de la 0
la 3
; cu toate acestea, ca la vectori, putem să numerotăm indicii de la 1
în loc de 0
, nelucrând cu elementele de pe linia/coloana 0
.1000 * 1000
este de 100
de ori mai mare decât una de 100 * 100
.Ca un fun fact pentru cei interesați, cum în memorie nu există noțiunea de 2D (adică toate informațiile din memorie sunt consecutive, una după alta), o matrice cu n
linii și m
coloane se salvează ca o înșiruire de n * m
elemente. Așadar, în anumite medii de programare, apelând elementul de pe linia 0
, coloana m
, o să obținem elementul de pe linia 1
, coloana 0
(deoarece matricea are coloane de la 0
la m - 1
, coloana m
este practic următorul element, adică de pe linia următoare și coloana 0
).
Spre exemplu, matricea de mai sus se reprezintă în memorie astfel: 1, 3, 6, 2, 2, 4, 12, 44, 0, 3, 5, 7
.
Cum probabil ați intuit, pentru accesarea elementului de pe linia i
și coloana j
a unei matrici a
, apelăm a[i][j]
. Spre exemplu, în matricea de mai sus, a[0][2] = 6
.
Parcurgerea unei matrice poate părea un pic mai greu de înțeles. Când vorbim de parcurgerea unei matrice, vrem să parcurgem elementele sale linie cu linie, de sus în jos și de la stânga la dreapta — exact cum se afișează pixelii pe un televizor:
(Secvență preluată de la The Slow Mo Guys)
Pentru a face acest lucru, vom folosi două structuri repetitive for
imbricate (una în alta): prima după i
, iar a doua după j
. Cea din afară (după i
) va parcurge, pe rând, liniile matricei, de la 0
la n - 1
. Pentru fiecare linie în parte, vom parcurge elementele de la stânga la dreapta (de la 0
la m - 1
) folosind al doilea for
(care este după j
). Astfel, reușim să parcurgem toate elementele matricei cu ușurință.
0
#include <iostream>
using namespace std;
int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea
int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane
//Parcurgem matricea exact cum am explicat anterior
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
a[i][j] = 1;
}
}
return 0;
}
1
Indexarea de la 1
înseamnă să numerotăm elementele matricei de la 1
la n
și de la 1
la m
, în loc să numerotăm de la 0
la n - 1
și de la 0
la m - 1
. De multe ori se preferă indexarea de la 1
(vom vedea mai târziu de ce), dar din această cauză vom folosi indexarea de la 1
de acum înainte. Să vedem cum se parcurge o matrice indexată de la 1:
#include <iostream>
using namespace std;
int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea
int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane
//Parcurgem matricea exact cum am explicat anterior
for(int i = 1; i <= n; i++) { //1 - n
for(int j = 1; j <= m; j++) { //1 - m
a[i][j] = 1;
}
}
return 0;
}
Citirea matricei folosește parcurgerea de mai devreme pentru a lua elementele pe rând și a le citi de la tastatură. Iată un exemplu:
cin >> n >> m; //Citim dimensiunile matricei
//Citim matricea, parcurgem cum am învățat anterior
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
cin >> a[i][j];
Afișarea unui tablou este similară, însă după ce afișăm fiecare linie în parte, trebuie să afișăm un endl
pentru a trece la următoarea linie.
//Afișăm matricea, parcurgem cum am învățat anterior
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++)
cout << a[i][j] << " ";
cout << endl;
}
Iată un cod în C++ care citește de la tastatură o matrice și o afișează pe ecran:
#include <iostream>
using namespace std;
int n, m, a[101][101]; //n = nr linii, m = nr coloane, a = matricea
int main()
{
cin >> n >> m; //Citim numărul de linii și de coloane
//Citim matricea
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> a[i][j];
}
}
//Afișăm matricea
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cout << a[i][j] << " ";
}
cout << "\n";
}
return 0;
}
Pentru lecția completă a matricelor pătratice, intră pe această pagină.
O matrice pătratică este o matrice particulară, cu același număr de linii și de coloane — adică cu n == m
. Pentru simplitate, vom menționa doar n
-ul, deoarece m
-ul are aceeași valoare. Matricea de acest tip are o serie de particularități care se folosesc în anumite probleme.
Diagonala principală a unei matrice este diagonala care începe din colțul stânga-sus și se termină în colțul dreapta-jos. Mai exact, un element a[i][j]
aparține diagonalei principale dacă i == j
.
Similar, diagonala secundară este cealaltă diagonală, care începe din colțul dreapta-sus și se termină în cel stânga-jos. Un element a[i][j]
aparține diagonalei secundare dacă i + j == n + 1
, sau cu alte cuvinte, j == n - i + 1
(unde matricea este indexată de la 1
).
În imaginea de mai jos, diagonala principală este cea roșie, diagonala secundară este cea albastră, elementul 4
(din mijloc) aparținând ambelor diagonale.
Completează următoarea secvență de cod:
Să se atribuie fiecărui element din matrice produsul indicilor săi:
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
a[i][j] = i * ???;
}
}
Care este cea mai mică dimensiune pe care o poate lua matricea astfel încât codul să funcționeze cum trebuie?
int a[3][???];
for(int i = 1; i <= 2; i++) {
for(int j = 1; j <= 3; j++) {
a[i][j] = 1;
}
}
# | Problemă | Dificultate | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
633. | Livada | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
692. | Fibosnek | Grea (8 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
132. | Suma valorilor impare din matrice | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
149. | Izolare | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
137. | Permutare in matrice | Ușoară (2 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Vrei mai multe probleme? Pe această pagină găsești întreaga listă de probleme propuse. |