Programare Competitivă

Diagonalele matricei

Într-o matrice pătratică (n x n), cele mai importante elemente sunt cele de pe diagonale. Ele împart matricea în zone cu proprietăți distincte.


Diagonala principală

Diagonala principală conține elementele unde linia este egală cu coloana: a[i][i].

Matrice 4 x 4:

[*] .  .  .       a[1][1]
 . [*] .  .       a[2][2]
 .  . [*] .       a[3][3]
 .  .  . [*]      a[4][4]

Afișarea diagonalei principale

for (int i = 1; i <= n; i++)
    fout << a[i][i] << " ";

Suma diagonalei principale

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

Diagonala secundară

Diagonala secundară conține elementele unde i + j == n + 1, adică a[i][n + 1 - i].

Matrice 4 x 4:

 .  .  . [*]      a[1][4]
 .  . [*] .       a[2][3]
 . [*] .  .       a[3][2]
[*] .  .  .       a[4][1]

Afișarea diagonalei secundare

for (int i = 1; i <= n; i++)
    fout << a[i][n + 1 - i] << " ";

Condiția generală

Un element a[i][j] este pe diagonala secundară dacă i + j == n + 1.


Ambele diagonale

Matrice 5 x 5:

[*] .  .  . [*]
 . [*] . [*] .
 .  . [*] .  .     ← centrul e pe ambele
 . [*] . [*] .
[*] .  .  . [*]

Un element este pe cel puțin o diagonală dacă i == j sau i + j == n + 1.

for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
        if (i == j || i + j == n + 1)
            fout << a[i][j] << " ";

Zonele matricei

Diagonalele împart matricea pătratică în 4 zone (triunghiuri):

Matrice 5 x 5:
\ N  N  N /
E \ N N / V
E E \ / V V
E E / \ V V
E / S S \ V
/ S  S  S \
  • N (Nord / deasupra ambelor diagonale): i < j și i < n + 1 - j → simplu: i < j && i + j < n + 1
  • S (Sud / sub ambele diagonale): i > j și i > n + 1 - j → simplu: i > j && i + j > n + 1
  • V (Vest / stânga): i > j și i + j < n + 1
  • E (Est / dreapta): i < j && i + j > n + 1

Dar mai simplu, ne concentrăm pe cele mai frecvente:


Deasupra diagonalei principale

Elementele unde i < j (linia mai mică decât coloana):

 .  *  *  *
 .  .  *  *
 .  .  .  *
 .  .  .  .
for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
        fout << a[i][j] << " ";

Sub diagonala principală

Elementele unde i > j:

 .  .  .  .
 *  .  .  .
 *  *  .  .
 *  *  *  .
for (int i = 2; i <= n; i++)
    for (int j = 1; j < i; j++)
        fout << a[i][j] << " ";

Deasupra diagonalei secundare

Elementele unde i + j < n + 1:

 .  *  *  .
 *  *  .  .
 *  .  .  .
 .  .  .  .
for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
        if (i + j < n + 1)
            fout << a[i][j] << " ";

Sub diagonala secundară

Elementele unde i + j > n + 1:

 .  .  .  .
 .  .  .  *
 .  .  *  *
 .  *  *  *
for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
        if (i + j > n + 1)
            fout << a[i][j] << " ";

Tabel rezumativ condiții

Zonă Condiție
Diagonala principală i == j
Diagonala secundară i + j == n + 1
Deasupra diag. principale i < j
Sub diag. principală i > j
Deasupra diag. secundare i + j < n + 1
Sub diag. secundară i + j > n + 1

Trucul: gândește-te la diagonala principală ca la linia i = j pe un grafic. Deasupra ei = i < j, sub ea = i > j. La diagonala secundară, linia este i + j = n + 1.


Exemplu complet: suma pe zone

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

int a[101][101];
int n;

int main()
{
    fin >> n;

    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            fin >> a[i][j];

    int sumaDiagP = 0, sumaDiagS = 0;
    int sumaDeasupra = 0, sumaSub = 0;

    for (int i = 1; i <= n; i++) {
        sumaDiagP = sumaDiagP + a[i][i];
        sumaDiagS = sumaDiagS + a[i][n + 1 - i];
        for (int j = 1; j <= n; j++) {
            if (i < j) sumaDeasupra = sumaDeasupra + a[i][j];
            if (i > j) sumaSub = sumaSub + a[i][j];
        }
    }

    fout << "Diag principala: " << sumaDiagP << endl;
    fout << "Diag secundara: " << sumaDiagS << endl;
    fout << "Deasupra diag principale: " << sumaDeasupra << endl;
    fout << "Sub diag principala: " << sumaSub << endl;

    return 0;
}

Greșeli frecvente

1. Confuzia între diagonala principală și secundară

  • Principală: i == j (stânga-sus spre dreapta-jos)
  • Secundară: i + j == n + 1 (dreapta-sus spre stânga-jos)

2. Formula greșită la diagonala secundară

a[i][n - i]     // GREȘIT (indexare de la 1)
a[i][n + 1 - i] // CORECT (indexare de la 1)
a[i][n - 1 - i] // CORECT (indexare de la 0)

3. Matricea nu e pătratică

Diagonalele au sens doar pe matrici pătratice (n == m). Pe o matrice dreptunghiulară, nu există diagonala principală în sens clasic.


Ce să reții

  • Diagonala principală: i == j.
  • Diagonala secundară: i + j == n + 1.
  • Deasupra/sub diagonala principală: i < j / i > j.
  • Deasupra/sub diagonala secundară: i + j < n + 1 / i + j > n + 1.
  • Diagonalele împart matricea pătratică în 4 zone (triunghiuri).
  • Funcționează doar pe matrici pătratice.

Probleme

pbinfoDiagonale

pbinfoDiagonale1

pbinfoZona4

pbinfoMatrice19