Algoritmi pe matrici în C++ – Teorie

1) Teorie (A–G)

Notă: În exemple se presupune using namespace std;. Indexarea este 0-based.

A) Declarare și dimensiuni

O matrice (tablou bidimensional) a cu maxime NMAX linii și MMAX coloane:

#include <iostream>
using namespace std;
int main(){
  const int NMAX=100, MMAX=100;
  int a[NMAX][MMAX];
  int n, m; // n=linii, m=coloane (dimensiuni efective)
  cin >> n >> m;
  return 0;
}

Recomandare: păstrează capacități maxime suficiente și folosește doar primele n×m elemente.

B) Citire și afișare

Citire (două bucle imbricate):

for(int i=0;i<n;i++)
  for(int j=0;j<m;j++)
    cin >> a[i][j];

Afișare în format tabelar:

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

C) Matrice dreptunghiulare (n ≠ m)

// transpunere b = a^T
int b[101][101];
for(int i=0;i<n;i++)
  for(int j=0;j<m;j++)
    b[j][i] = a[i][j];

D) Matrice pătratice (n = m)

Au proprietăți legate de diagonale și simetrii. Se folosesc formulele de mai jos.

E) Diagonale – formule

Suma pe DP:

int sDP = 0;
for(int i=0;i<n;i++) sDP += a[i][i];

Suma pe DS:

int sDS = 0;
for(int i=0;i<n;i++) sDS += a[i][n-1-i];

F) Simetrie față de diagonale

// test simetrie DP
bool ok = true;
for(int i=0;i<n;i++)
  for(int j=i+1;j<n;j++)
    if(a[i][j] != a[j][i]) ok = false;
cout << (ok ? "simetrica DP" : "nu e simetrica DP");
// test simetrie DS
bool ok2 = true;
for(int i=0;i<n;i++)
  for(int j=0;j<n;j++){
    int ii = n-1-j, jj = n-1-i;
    if(a[i][j] != a[ii][jj]) ok2 = false;
  }
cout << (ok2 ? "simetrica DS" : "nu e simetrica DS");

G) Triunghiurile SVEN

Diagonalele împart matricea pătratică în 4 regiuni (fără elementele de pe diagonale):

// sume pe fiecare triunghi
int sN=0,sS=0,sV=0,sE=0;
for(int i=0;i<n;i++)
  for(int j=0;j<n;j++){
    if(i < j && i + j < n - 1) sN += a[i][j];
    if(i > j && i + j > n - 1) sS += a[i][j];
    if(i > j && i + j < n - 1) sV += a[i][j];
    if(i < j && i + j > n - 1) sE += a[i][j];
  }
cout << sN << " " << sS << " " << sV << " " << sE;
Elementele cu i==j (DP) sau i+j==n-1 (DS) nu aparțin niciunui triunghi.

2) Prelucrarea elementelor

Teorie

Prelucrarea elementelor unei matrice (tablouri bidimensionale) se face, în mod uzual, cu două bucle imbricate: indicele de linie i în exterior și indicele de coloană j în interior. Parcurgerea standard (rând cu rând) este:

for (int i = 0; i < m; i++)
  for (int j = 0; j < n; j++)
    /* prelucrează a[i][j] */;

Problemă rezolvată

Enunț: Se citește matricea a cu m linii și n coloane (m, n ≤ 30), numere întregi de cel mult 4 cifre. Determinați valoarea maximă și de câte ori apare în tablou.

Exemplu:
m = 3, n = 4
Matricea:
2 7 7 -1
5 9 3 9
9 0 4 1
Rezultat: maxim = 9, apare de 3 ori

#include <iostream>
using namespace std;

int main() {
  int m, n, a[30][30];
  cin >> m >> n;
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      cin >> a[i][j];

  int maxi = a[0][0], freq = 0;

  // determin maximul
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] > maxi) maxi = a[i][j];

  // număr câte ori apare maximul
  for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] == maxi) freq = freq + 1;

  cout << maxi << " " << freq;
  return 0;
}

Exerciții propuse (fiecare cu exemplu)

1. Maximul și de câte ori apare (ca mai sus).

Exemplu: vezi problema rezolvată.

2. Verificați dacă toate valorile sunt memorate în ordine crescătoare (parcurgere pe linii, stânga→dreapta, sus→jos).

Exemplu:
m=2, n=3
1 2 3
3 3 8
Rezultat: Da (fiecare element ≤ următorul în parcurgerea rând-cu-rând).

3. Înlocuiți toate valorile minime din matrice cu valoarea maximă (afișați matricea rezultată).

Exemplu:
4 -2 7
-2 1 7
Minim = -2, Maxim = 7 ⇒
4 7 7
7 1 7

4. Calculați procentul elementelor prime din matrice.

Exemplu:
2 4 5
6 7 8
Elementele prime: 2,5,7 din 6 ⇒ procent ≈ 50%.

5. Afișați ultima cifră a produsului elementelor impare de pe coloanele pare (indexare 0-based: coloanele cu j = 0,2,4,...).

Exemplu:
m=2, n=4
3 6 5 2
7 4 8 9
Coloane pare: j=0 și j=2 ⇒ elemente impare: 3,5,7 ⇒ produs=105 ⇒ ultima cifră = 5.

6. Afișați liniile impare (i=0,2,4,...) de la stânga la dreapta și liniile pare (i=1,3,5,...) de la dreapta la stânga.

Exemplu:
Matrice:
[0] 1 2 3 4
[1] 5 6 7 8
[2] 9 0 1 2
Afișare:
linia 0: 1 2 3 4
linia 1: 8 7 6 5
linia 2: 9 0 1 2

7. Pentru matrice pătratică n×n (2≤n≤20), afișați valorile care sunt strict mai mici decât toți vecinii direcți (sus, jos, stânga, dreapta – dacă există).

Exemplu:
n=4
5 4 7 9
6 9 3 4
1 9 8 5
2 3 8 6
Rezultat: 2, 1

8a. În fișierul date.in: n pe prima linie, apoi matricea n×n. Determinați suma pe DP și suma pe DS (memorând în tablou).

Exemplu:
n=3; matrice:
1 2 3
4 5 6
7 8 9
DP: 1+5+9=15, DS: 3+5+7=15

8b. Aceeași cerință ca 8a, dar fără a memora matricea (doar variabile simple).

Exemplu: identic cu 8a, rezultat DP=15, DS=15.

9. Verificați dacă există elemente egale cu suma indicilor (a[i][j] == i + j).

Exemplu:
m=2, n=3
0 1 5
7 3 4
Pentru (i,j)=(0,0) ⇒ 0==0+0 ✔, (0,1) ⇒ 1==0+1 ✔ ⇒ Da.

10. Determinați dacă toate componentele sunt distincte (Da/Nu).

Exemplu:
1 2 3
4 5 6 ⇒ Da
1 2 3
4 5 3 ⇒ Nu (valoarea 3 se repetă)

11. Două matrice a și b (m×n) memorează aceleași valori dar posibil în altă ordine? (Comparați mulțimile cu multiplicitate – “multiset”).

Exemplu:
a: 1 2 2 / 3 4 5
b: 2 5 4 / 2 1 3 ⇒ Da (aceleași valori, numai permutate)

12. Din matricea a (m×n) de întregi (până la 9 cifre) generați matricea b cu suma cifrelor și matricea c cu numărul cifrelor (pentru fiecare element a[i][j]).

Exemplu:
a = [ 507 -12 ]
Suma cifrelor (modul): b = [ 12 3 ] (5+0+7=12; |−12|→1+2=3)
Nr. cifre (modul, 0 are 1 cifră): c = [ 3 2 ]

13. Pentru două matrice pătratice n×n (max 2 cifre/element), determinați suma și produsul lor (clasic, O(n³)).

Exemplu:
n=2
A = [1 2; 3 4], B = [5 6; 7 8]
A+B = [6 8; 10 12]
A×B = [1*5+2*7, 1*6+2*8; 3*5+4*7, 3*6+4*8] = [19 22; 43 50]

3) Prelucrare linie/linii

Teorie. Prelucrările „pe linie” folosesc aceleași tipare ca la vectori, dar repetate pentru fiecare linie: se parcurge linia cu un acumulatoare (suma, minim, maxim, frecvențe), apoi se reinițializează și se trece la linia următoare. Atenție la inițializări corecte (de ex. minimul începe cu o valoare foarte mare) și la momentul afișării (după ce s-a terminat prelucrarea liniei). Complexitatea rămâne, în general, O(m·n), unde m = număr de linii și n = număr de coloane.

1. Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane (m ≤ 30, n ≤ 30) cu numere întregi de cel mult 4 cifre. Să se afişeze minimul fiecărei linii și apoi maximul dintre aceste minime.

Exemplu:
Matrice:
2 4 5
7 3 8
9 6 1
Minime pe linii: 2, 3, 1 → Maxim dintre minime: 3.

#include <iostream>
using namespace std;

int main() {
    int a[30][30], m, n;
    cin >> m >> n;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    int maxim_din_minime = -1000000000;
    for (int i = 0; i < m; i++) {
        int minim_linie = 1000000000;
        for (int j = 0; j < n; j++)
            if (a[i][j] < minim_linie) minim_linie = a[i][j];

        cout << "Minimul liniei " << (i+1) << " = " << minim_linie << "\n";
        if (minim_linie > maxim_din_minime) maxim_din_minime = minim_linie;
    }
    cout << "Maximul dintre minime = " << maxim_din_minime << "\n";
    return 0;
}
    

2. Se citesc m, n (≤30) și matricea de întregi. Să se afişeze indicele/indicii liniei cu suma maximă a elementelor.

Exemplu:
2 4 5 1 → sumă = 12
1 1 4 5 → sumă = 11
2 6 1 3 → sumă = 12
Se afişează: 1 3 (numerotare de la 1).

3. Se citeşte matricea A (m×n, m,n≤30). Să se „bordeze” cu linia m+1 și coloana n+1, unde A[m+1][j] este suma pe coloana j, A[i][n+1] este suma pe linia i, iar A[m+1][n+1] este suma totală.

Exemplu:
A =
1 2 3
4 0 1
Devine (cu sume):
1 2 3 | 6
4 0 1 | 5
-----+--
5 2 4 | 11

4. Se citeşte matricea (m,n≤30) și doi indici p, q (1-indexați). Să se interschimbe liniile p și q.

Exemplu:
A înainte (m=3, n=3), p=1, q=3:
1 2 3
4 5 6
7 8 9
A după:
7 8 9
4 5 6
1 2 3

5. (Sumă pe linii egale – perechi) Să se afişeze perechile de indici de linii cu aceeaşi sumă a elementelor.

Exemplu:
Pentru matricea:
2 4 5 1
1 1 4 5
2 6 1 3
2 0 5 4
8 0 0 4
Se afişează: (1, 3), (1, 5), (3, 5), (2, 4).

6. (Sumă pe linii egale – grupuri) Să se afişeze grupurile de linii care au aceeaşi sumă (numerotare de la 1).

Exemplu:
Matrice:
2 4 5 1
1 1 4 5
2 6 1 3
2 0 5 4
8 0 0 4
3 4 5 6
Se afişează: (1, 3, 5), (2, 4), (6).

7. Se citeşte o matrice pătratică (2≤n≤24). Să se afişeze elementul maxim de pe primul pătrat concentric (prima și ultima linie, prima și ultima coloană).

Exemplu:
Pentru n=4:
5 7 2 9
3 1 4 8
6 0 2 5
1 3 7 4
Pătratul exterior: (5,7,2,9,8,5,4,1,3,7,1,3,6,0,2,5) → max = 9.

8. Se citesc m,n (≤30), valoarea x și matricea. Să se afişeze indicii liniilor care conțin valoarea x cel puțin o dată.

Exemplu:
m=3, n=4, x=5, matricea:
2 3 5 5
1 2 4 6
5 0 7 8
Se afişează: 1 3.

9. Matrice binară (valori 0/1). Să se afişeze perechile de linii care memorează aceleaşi valori, nu neapărat în aceeaşi ordine (adică acelaşi număr de 0 și 1 pe linie).

Exemplu:
m=5, n=3:
1 1 0
1 0 1
0 0 1
0 1 1
1 0 0
Se afişează: (1, 2), (1, 4), (2, 4), (3, 5).

10. Matrice binară (0/1). Să se afişeze grupurile de linii care memorează aceleaşi valori (multiset egal).

Exemplu:
m=6, n=3:
1 1 0
1 0 1
0 0 1
0 1 1
1 0 0
1 1 1
Se afişează: (1, 2, 4), (3, 5), (6).

11. Matrice binară (0/1). Pentru fiecare linie considerată ca un număr în baza 2 (bitul din stânga este cel mai semnificativ), să se afişeze cea mai mare valoare zecimală obținută.

Exemplu:
m=5, n=3:
0 1 0 → 2
0 0 1 → 1
1 0 1 → 5
0 1 1 → 3
1 0 0 → 4
Se afişează: 5.

12. Matrice de întregi (m,n≤30). Să se stabilească dacă există elemente comune tuturor liniilor (intersecţia mulțimilor de pe linii).

Exemplu:
m=5, n=3:
0 1 2
5 0 1
6 0 1
0 1 1
1 9 0
Se afişează: 0 1.

13. Matrice de reale (m,n≤40). Să se afişeze câte linii au toate componentele strict pozitive.

Exemplu:
1.5 0.1
3.2 -1.0
0.3 2.7
Se afişează: 2 (liniile 1 și 3).

14. Matrice de reale (m,n≤40). Să se afişeze indicii liniilor ale căror elemente sunt ordonate crescător (strict sau larg crescător – precizați în rezolvare; implicit neasemenea: larg crescător).

Exemplu (larg crescător):
1 2 2 4 → OK
3 1 5 7 → NU
0 0 0 1 → OK
Se afişează: 1 3.

4) Prelucrarea coloanei/coloanelor

Prelucrarea coloanelor într-o matrice presupune aplicarea unor operații pe verticală, de-a lungul unui indice fix de coloană. Astfel, putem calcula sume, produse, valori minime sau maxime pentru fiecare coloană. În alte situații, putem verifica proprietăți specifice (de exemplu, dacă toate valorile dintr-o coloană sunt identice, dacă există zerouri sau dacă elementele sunt ordonate crescător). Acest tip de prelucrare este foarte frecvent întâlnit în problemele care implică organizarea și analiza datelor în structuri tabelare.

Exercițiu rezolvat

Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane (m<=30, n<=30) care memorează numere întregi de cel mult patru cifre fiecare. Să se afişeze indicii coloanei/coloanelor care nu conţin zerouri.

Exemplu:
Pentru m=3, n=4 și tabloul:
1  2  0  4
3  5  6  7
8  9  1  2
Se vor afișa coloanele: 2, 4 (deoarece aceste coloane nu conțin elemente egale cu zero).


#include <iostream>
using namespace std;

int main() {
    int m, n, a[31][31];
    cin >> m >> n;

    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    for (int j = 0; j < n; j++) {
        bool areZero = false;
        for (int i = 0; i < m; i++) {
            if (a[i][j] == 0) {
                areZero = true;
                break;
            }
        }
        if (!areZero) {
            cout << (j + 1) << " ";
        }
    }

    return 0;
}
  

Exerciții propuse

  1. Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane (m<=30, n<=30). Interschimbaţi coloanele tabloului astfel încât elementele de pe linia k să fie ordonate crescător.

    Exemplu:
    Pentru m=3, n=4, k=2 și tabloul:
    7  3  5  9
    4  1  8  2
    6  0  7  3
    Coloanele se rearanjează în funcție de linia a doua: 1,2,4,8 → ordonare crescătoare.
    Matricea devine:
    3  9  7  5
    1  2  4  8
    0  3  6  7

  2. Enunț: Scrieţi un program care citeşte un tablou bidimensional și să se interschimbe valorile de pe coloana p cu valorile de pe coloana q.

    Exemplu:
    Pentru m=3, n=3, p=1, q=3 și tabloul:
    1  2  3
    4  5  6
    7  8  9
    Matricea devine:
    3  2  1
    6  5  4
    9  8  7

  3. Enunț: Scrieţi un program care afişează elementele din tablou egale cu suma celorlalte elemente de pe coloana lor.

    Exemplu:
    Pentru matricea:
    2  3  1  5
    1  8  7  2
    1  5  3  3
    Se afişează: 2, 5, 8

  4. Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane. Să se afişeze indicii coloanelor având produsul elementelor cu valoare maximă.

    Exemplu:
    Pentru m=3, n=3 și tabloul:
    1  2  1
    2  2  2
    1  2  3
    Produsul col.1 = 2, col.2 = 8, col.3 = 6 → se afişează: 2

  5. Enunț: Să se afişeze indicii coloanelor cu valori identice pe întreaga coloană. Dacă nu există astfel de coloane se va afişa un mesaj.

    Exemplu:
    Pentru matricea:
    2  1  9  2  1
    2  3  2  2  1
    2  1  1  2  1
    Se afişează: 1, 4, 5

  6. Enunț: Să se determine dacă elementele de pe coloana X sunt ordonate crescător.

    Exemplu:
    Pentru X=2 și matricea:
    1  2  3
    4  5  6
    7  8  9
    Coloana 2: 2, 5, 8 → răspuns: Da

  7. Enunț: Să se ordoneze crescător elementele de pe coloana X.

    Exemplu:
    Pentru X=3 și matricea:
    7  2  9
    4  5  3
    6  8  1
    Coloana 3 devine ordonată: 1, 3, 9
    Noua matrice:
    7  2  1
    4  5  3
    6  8  9

5) Ștergerea unei linii

Ștergerea unei linii dintr-o matrice presupune eliminarea tuturor elementelor aflate pe o anumită poziție de linie și rearanjarea matricei astfel încât să rămână compactă. Această operație este utilă atunci când anumite date nu mai sunt necesare (de exemplu linii cu zerouri, linii duplicate sau linii care îndeplinesc o anumită condiție). În implementarea practică, ștergerea se face prin deplasarea liniilor de sub linia eliminată cu o poziție în sus.

Exercițiu rezolvat

Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane (m<=30, n<=30). Să se afişeze tabloul obţinut prin ștergerea liniei k.

Exemplu:
Pentru m=4, n=3, k=2 și tabloul:
1  2  3
4  5  6
7  8  9
0  1  2
Rezultatul este:
1  2  3
7  8  9
0  1  2


#include <iostream>
using namespace std;

int main() {
    int m, n, k, a[31][31];
    cin >> m >> n >> k;

    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    // Ștergere linia k (index de la 1 la m)
    for (int i = k - 1; i < m - 1; i++)
        for (int j = 0; j < n; j++)
            a[i][j] = a[i + 1][j];
    m--; // scădem numărul de linii

    // Afișare matrice rezultat
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }

    return 0;
}
  

Exerciții propuse

  1. Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane. Să se afişeze tabloul obţinut prin eliminarea elementelor de pe liniile impare.

    Exemplu:
    Pentru m=4, n=3 și tabloul:
    1  2  3
    4  5  6
    7  8  9
    0  1  2
    Rezultatul este:
    4  5  6
    0  1  2

  2. Enunț: Scrieţi un program care citeşte o matrice și să se afişeze tabloul obţinut prin ștergerea liniilor care conţin zerouri.

    Exemplu:
    Pentru matricea:
    1  2  3
    4  0  6
    7  8  9
    0  1  2
    Rezultatul este:
    1  2  3
    7  8  9

  3. Enunț: Scrieţi un program care afişează matricea obţinută prin ştergerea liniei şi coloanei care memorează valoarea minimă.

    Exemplu:
    Pentru matricea:
    5  9  3
    8  1  7
    6  2  4
    Valoarea minimă = 1 (linia 2, coloana 2). Rezultatul este:
    5  3
    6  4

  4. Enunț: Scrieţi un program care citeşte o matrice și să se afişeze tabloul obţinut prin ștergerea liniilor care memorează dubluri.

    Exemplu:
    Pentru matricea:
    1  2  3
    4  4  6
    7  8  9
    5  5  5
    Rezultatul este:
    1  2  3
    7  8  9

  5. Enunț: Fie un tablou bidimensional cu m linii şi n coloane. Să se elimine liniile din matrice astfel încât să nu existe linii identice.

    Exemplu:
    Pentru m=5, n=2 şi matricea:
    2  3
    4  5
    2  3
    2  3
    4  5
    Rezultatul este:
    2  3
    4  5

6) Ștergerea unei coloane

Ștergerea unei coloane dintr-o matrice presupune eliminarea tuturor elementelor aflate pe o anumită poziție de coloană și rearanjarea matricei astfel încât să rămână compactă. Această operație este folosită frecvent atunci când dorim să eliminăm informații inutile sau coloane care îndeplinesc o anumită condiție (ex: conțin numere negative). Practic, ștergerea se face prin deplasarea coloanelor din dreapta coloanei eliminate cu o poziție spre stânga.

Exercițiu rezolvat

Enunț: Scrieţi un program care citeşte un tablou bidimensional cu m linii şi n coloane (m<=30, n<=30). Să se afişeze tabloul obţinut prin ștergerea coloanei k.

Exemplu:
Pentru m=3, n=4, k=2 și tabloul:
1  2  3  4
5  6  7  8
9  0  1  2
Rezultatul este:
1  3  4
5  7  8
9  1  2


#include <iostream>
using namespace std;

int main() {
    int m, n, k, a[31][31];
    cin >> m >> n >> k;

    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            cin >> a[i][j];

    // Ștergere coloana k (index de la 1 la n)
    for (int i = 0; i < m; i++) {
        for (int j = k - 1; j < n - 1; j++) {
            a[i][j] = a[i][j + 1];
        }
    }
    n--; // scădem numărul de coloane

    // Afișare matrice rezultat
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
        cout << "\n";
    }

    return 0;
}
  

Exerciții propuse

  1. Enunț: Scrieţi un program care afişează tabloul obţinut prin eliminarea elementelor de pe coloanele pare.

    Exemplu:
    Pentru matricea:
    1  2  3  4
    5  6  7  8
    Rezultatul este:
    1  3
    5  7

  2. Enunț: Scrieţi un program care afişează tabloul obţinut prin ștergerea coloanelor care conţin numere negative.

    Exemplu:
    Pentru matricea:
    1  -2  3
    4  5  -6
    Rezultatul este:
    1  3
    4  5

  3. Enunț: Scrieţi un program care elimină coloanele care au suma elementelor mai mică decât un număr întreg x citit.

    Exemplu:
    Pentru x=10 și matricea:
    1  5  9
    2  3  7
    4  1  2
    Sumele coloanelor: [7, 9, 18]. Se elimină primele două coloane. Rezultatul este:
    9
    7
    2

  4. Enunț: Scrieţi un program care elimină coloanele care memorează numai valori numerice formate dintr-o singură cifră.

    Exemplu:
    Pentru matricea:
    1  12  9
    3  45  7
    8  67  2
    Se elimină coloanele 1 și 3. Rezultatul este:
    12
    45
    67

  5. Enunț: Scrieţi un program care elimină coloana ce conţine cea mai mare valoare de pe prima linie. Dacă există mai multe valori maxime egale, se șterge coloana cu cel mai mic indice.

    Exemplu:
    Pentru matricea:
    5  9  9  7
    2  3  4  6
    1  8  0  5
    Valoarea maximă pe prima linie este 9 (coloanele 2 și 3). Se șterge coloana 2. Rezultatul este:
    5  9  7
    2  4  6
    1  0  5

7) Probleme de generare

Problemele de generare presupun construirea unor matrice după reguli bine definite, de obicei pe baza unor șiruri numerice (numere naturale, numere pare, pătrate perfecte, șirul lui Fibonacci etc.). Acestea necesită observarea tiparelor și implementarea lor într-o formă algoritmică eficientă. Astfel de probleme sunt utile pentru dezvoltarea gândirii logice și pentru înțelegerea mai profundă a lucrului cu structurile bidimensionale.

Exercițiu rezolvat

Enunț: Se citesc două numere naturale n și m. Să se construiască o matrice cu numerele de la 1 la n×m, completate pe coloane.

Exemplu:

Pentru n=3, m=4 matricea este:
1 4 7 10
2 5 8 11
3 6 9 12

#include <iostream>
using namespace std;

int main() {
    int n, m, val = 1;
    cin >> n >> m;
    int a[50][50];
    
    for (int j = 0; j < m; j++) {
        for (int i = 0; i < n; i++) {
            a[i][j] = val;
            val++;
        }
    }
    
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
  

Probleme propuse

  1. Se citeşte un număr natural nenul x cu exact 5 cifre. Să se genereze un tablou bidimensional pătratic ce memorează cifra unităţilor lui x pe prima linie, cifra zecilor pe cea de a doua linie etc.
    Exemplu:
    Pentru x=54321 se obține:
    1 1 1 1 1
    2 2 2 2 2
    3 3 3 3 3
    4 4 4 4 4
    5 5 5 5 5
  2. Se citeşte un număr natural nenul x cu cel mult nouă cifre. Să se genereze o matrice pătratică ce memorează cifra unităţilor lui x pe prima linie, cifra zecilor pe cea de a doua linie etc.
    Exemplu:
    Pentru x=98765 se obține:
    5 5 5 5 5
    6 6 6 6 6
    7 7 7 7 7
    8 8 8 8 8
    9 9 9 9 9
  3. Se citeşte un număr natural nenul x cu cel mult nouă cifre. Să se genereze o matrice pătratică ce memorează cifra unităţilor lui x pe prima coloană, cifra zecilor pe cea de a doua coloană etc.
    Exemplu:
    Pentru x=4321 se obține:
    1 2 3 4
    1 2 3 4
    1 2 3 4
    1 2 3 4
  4. Se citeşte un număr natural nenul x cu cel mult nouă cifre. Să se genereze o matrice pătratică ce memorează în ordine, pe linii, cifrele numărului întreg x.
    Exemplu:
    Pentru x=4562 se obține:
    4 5 6 2
    4 5 6 2
    4 5 6 2
    4 5 6 2
  5. Se citesc două numere naturale n și p (2≤n≤20, 2≤p≤20) și se construiește o matrice cu primele n×p pătrate perfecte impare, în ordine strict crescătoare.
    Exemplu:
    Pentru n=2, p=3:
    1 9 25
    49 81 121
  6. Se citeşte un număr natural n (2<n<20) și se construiește o matrice în care fiecare element de pe diagonala secundară are valoarea n, elementele deasupra diagonalei secundare scad cu 1 spre stânga, iar cele de sub cresc cu 1 spre dreapta.
    Exemplu:
    Pentru n=5:
    1 2 3 4 5
    2 3 4 5 6
    3 4 5 6 7
    4 5 6 7 8
    5 6 7 8 9
  7. Se citeşte un număr natural n (2<n<20) și se construiește o matrice care conține pe prima linie 1..n, iar următoarele linii sunt permutări circulare la stânga.
    Exemplu:
    Pentru n=5:
    1 2 3 4 5
    2 3 4 5 1
    3 4 5 1 2
    4 5 1 2 3
    5 1 2 3 4
  8. Se citeşte un număr natural n (2<n<20) și se construiește o matrice pătratică unde chenarul exterior are valoarea linie+coloană, iar interiorul este suma vecinilor de pe linia anterioară.
    Exemplu:
    Pentru n=5:
    2 3 4 5 6
    3 9 12 15 7
    4 24 36 34 8
    5 64 94 78 9
    6 7 8 9 10
  9. Se citeşte un număr natural n (2<n<10) și se construiește o matrice cu primele n×n numere pare, în ordine crescătoare.
    Exemplu:
    Pentru n=4:
    2 4 6 8
    10 12 14 16
    18 20 22 24
    26 28 30 32
  10. Se citeşte un număr natural n (2<n<20) și se construiește o matrice cu primele n×n numere pare care nu sunt multipli de 3.
    Exemplu:
    Pentru n=3:
    2 4 8
    10 14 16
    20 22 26
  11. Se citeşte un număr natural n (0<n≤24) și se construiește o matrice unde diagonala principală are 2, deasupra sunt 1, iar sub sunt 3.
    Exemplu:
    Pentru n=4:
    2 1 1 1
    3 2 1 1
    3 3 2 1
    3 3 3 2
  12. Se citeşte un număr natural n și două valori p, q (2<n<25, 0<p,q<n). Matricea conține valori 0,1,2,3,4 în funcție de poziția față de linia p și coloana q.
    Exemplu:
    Pentru n=5, p=4, q=3:
    1 1 0 2 2
    1 1 0 2 2
    1 1 0 2 2
    0 0 0 0 0
    3 3 0 4 4
  13. Se citeşte un număr natural n și m (1≤n,m≤50). Se construiește matricea cu numere de la 1 la n×m, completate pe coloane.
    Exemplu:
    Pentru n=5, m=4:
    1 6 11 16
    2 7 12 17
    3 8 13 18
    4 9 14 19
    5 10 15 20
  14. Se citeşte un număr natural n și m (1≤n,m≤50). Se construiește matricea cu primii n×m termeni din șirul lui Fibonacci.
    Exemplu:
    Pentru n=3, m=4:
    0 1 1 2
    3 5 8 13
    21 34 55 89

8) Schimbarea ordinii elementelor

Problemele din această categorie urmăresc rearanjarea elementelor unei matrice, fie prin sortare, fie prin inversare sau rotație. Este important să se păstreze structura matricei, dar ordinea elementelor să fie modificată conform cerinței. Se aplică adesea algoritmi de sortare, rotație sau rearanjare pe linii și coloane. Astfel de transformări sunt utile pentru organizarea datelor și pentru a evidenția diferite proprietăți ale matricei.

Exercițiu rezolvat

Se citește o matrice cu m linii și n coloane (m≤30, n≤30) care memorează numere întregi de cel mult patru cifre fiecare. Să se modifice ordinea elementelor astfel încât fiecare linie să fie ordonată crescător.

Exemplu:
Pentru m=3, n=4:
5 6 8 3 → 3 5 6 8
2 9 1 6 → 1 2 6 9
8 1 8 2 → 1 2 8 8

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

int main() {
    int m, n, a[30][30];
    cin >> m >> n;
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++)
            cin >> a[i][j];
    for(int i=0; i<m; i++)
        sort(a[i], a[i] + n);
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
    return 0;
}
  

Probleme propuse

  1. Să se modifice ordinea elementelor astfel încât fiecare linie să fie ordonată crescător.
    Exemplu:
    Pentru m=3, n=4:
    5 6 8 3 → 3 5 6 8
    2 9 1 6 → 1 2 6 9
    8 1 8 2 → 1 2 8 8
  2. Să se modifice ordinea elementelor astfel încât fiecare coloană să fie ordonată crescător.
    Exemplu:
    Pentru m=3, n=3:
    5 6 8 → 2 1 2
    2 9 1 → 5 6 8
    8 1 2 → 8 9 1
  3. Să se modifice ordinea elementelor astfel încât, parcurgând matricea de sus în jos și de la stânga la dreapta, aceasta să conțină elementele în ordine crescătoare.
    Exemplu:
    Pentru m=3, n=3:
    5 6 8 → 1 2 3
    2 9 1 → 5 6 6
    8 1 2 → 8 8 9
  4. Să se modifice ordinea elementelor astfel încât aceasta să conțină la început elementele pare apoi elementele impare.
    Exemplu:
    Pentru m=2, n=5:
    1 4 7 2 5 → 4 2 1 7 5
    6 3 9 8 2 → 6 8 2 3 9
  5. Să se afișeze indicii coloanelor a căror elemente se pot obține din suma altor două coloane.
    Exemplu:
    Pentru m=3, n=5:
    1 2 1 3 5
    2 3 1 5 8
    7 2 2 9 11
    → Coloana 4 = coloana 1 + coloana 2, Coloana 5 = coloana 2 + coloana 4
  6. Să se inverseze ordinea elementelor în cadrul fiecărei linii.
    Exemplu:
    Pentru n=3, m=5:
    1 2 3 4 5 → 5 4 3 2 1
    3 4 1 2 1 → 1 2 1 4 3
    2 3 4 1 8 → 8 1 4 3 2
  7. Programul va construi și va afișa pe ecran un nou tablou bidimensional obținut prin rotirea acestuia în sens trigonometric cu 90°.
    Exemplu:
    Pentru m=3, n=3:
    1 2 3 → 3 6 9
    4 5 6 → 2 5 8
    7 8 9 → 1 4 7

9) Matrice pătratice

A) Prelucrarea diagonalelor

O matrice pătratică are două diagonale importante: diagonala principală (elementele cu indici egali, a[i][i]) și diagonala secundară (elementele cu indici complementari, a[i][n−i−1]). Prelucrarea lor presupune operații precum afișarea, sortarea, verificarea elementelor prime sau schimbul dintre diagonale. În multe probleme, diagonalele definesc și zone utile pentru calcule suplimentare.

Exemplu rezolvat

Problema: Se citește o matrice pătratică de dimensiune n×n. Să se afișeze elementele de pe diagonala principală.

Exemplu:

Pentru n=3:
1  2  3
4  5  6
7  8  9

Diagonala principală: 1 5 9
  

Rezolvare C++:

#include <iostream>
using namespace std;

int main() {
    int n, a[30][30];
    cin >> n;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> a[i][j];

    cout << "Diagonala principala: ";
    for(int i=0; i<n; i++)
        cout << a[i][i] << " ";
    return 0;
}
  

Probleme propuse

  1. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30), ce memorează numere întregi de cel mult 4 cifre fiecare. Scrieţi un program care afişează: – Valorile de pe diagonala principală – Valorile de pe diagonala secundară – Valorile de pe diagonale în ordine inversă – Valorile prime de pe diagonala principală – Valoarea maximă de pe ambele diagonale
    Exemplu:
    Pentru n=3:
    2 3 4
    5 7 6
    9 8 1
    DP: 2,7,1; DS: 4,7,9; Max: 9
  2. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30). Să se calculeze suma acelor elemente de pe diagonala principală care sunt valori minime pe liniile lor.
    Exemplu:
    Pentru n=4:
    8 9 2 6
    5 2 8 10
    1 2 4 6
    7 8 6 3
    Minime pe linii și pe DP: 2 și 3 → Suma = 5
  3. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30). Să se ordoneze crescător elementele de pe diagonala principală fără a schimba celelalte elemente.
    Exemplu:
    Pentru n=3:
    9 2 3
    4 5 6
    7 8 1
    DP înainte: 9,5,1 → sortat: 1,5,9
  4. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30). Să se ordoneze descrescător elementele de pe diagonala secundară fără a schimba celelalte elemente.
    Exemplu:
    Pentru n=3:
    1 2 9
    4 8 6
    7 5 3
    DS înainte: 9,8,7 → sortat desc: 9,8,7 (fără modificare)
  5. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30). Să se schimbe elementele de pe diagonala principală cu cele de pe diagonala secundară (pe aceeaşi linie).
    Exemplu:
    Pentru n=3:
    1 2 3
    4 5 6
    7 8 9
    → După schimb:
    3 2 1
    4 5 6
    9 8 7

B) Prelucrarea zonelor delimitate de diagonale

Diagonalele unei matrice pătratice împart tabloul în patru zone: deasupra și sub diagonala principală, respectiv deasupra și sub diagonala secundară. În aceste regiuni putem calcula sume, produse, verifica parități sau genera valori. Este esențială identificarea corectă a indicilor pentru a include doar zona cerută și pentru a exclude diagonalele când problema o specifică.

Exemplu rezolvat

Problema: Se citește o matrice pătratică de dimensiune n×n. Să se calculeze suma elementelor aflate strict sub diagonala principală.

Exemplu:

Pentru n=3:
1  2  3
4  5  6
7  8  9

Elemente sub DP: 4, 7, 8
Suma = 19
  

Rezolvare C++:

#include <iostream>
using namespace std;

int main() {
    int n, a[30][30], suma = 0;
    cin >> n;
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin >> a[i][j];

    for(int i=1; i<n; i++)
        for(int j=0; j<i; j++)
            suma += a[i][j];

    cout << "Suma = " << suma;
    return 0;
}
  

Probleme propuse

  1. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤30). Să se calculeze suma elementelor de sub diagonala principală și suma elementelor de deasupra diagonalei principale (exclusiv DP) și să se afișeze suma mai mare.
    Exemplu:
    Pentru n=3:
    1 2 3
    4 5 6
    7 8 9
    Sub DP: 19, Peste DP: 11 → Răspuns: 19
  2. Se consideră o matrice pătratică cu n linii şi n coloane (1≤n≤15). Să se calculeze produsul elementelor de sub diagonala secundară și produsul elementelor de deasupra acesteia (exclusiv DS) și să se afișeze produsul mai mare.
    Exemplu:
    Pentru n=3:
    2 3 1
    4 5 6
    7 8 9
    Produs sub DS = 336, Produs peste DS = 24 → Răspuns: 336
  3. Din fișierul mat.in se citesc n și matricea pătratică. a) Verificați dacă toate elementele strict deasupra diagonalei secundare au aceeași paritate. b) Verificați dacă toate elementele strict sub diagonala principală au același semn.
    Exemplu:
    Pentru n=3:
    2 4 6
    -1 5 7
    -2 -3 8
    a) NU (parități diferite), b) DA (toate negative)
  4. Să se genereze o matrice n×n cu 0 pe diagonale și valori 1,2,3,4 în zonele delimitate de acestea.
    Exemplu:
    Pentru n=5:
    0 1 1 1 0
    2 0 1 0 3
    2 2 0 3 3
    2 0 4 0 3
    0 4 4 4 0
  5. Să se verifice dacă o matrice pătratică este pătrat magic: suma elementelor pe fiecare linie, coloană și diagonală este aceeași și matricea conține valorile 1..n².
    Exemplu:
    Pentru n=3:
    6 1 8
    7 5 3
    2 9 4
    → Pătrat magic (suma = 15).

Reclame Google AdSense

Flux de știri