Zone determinate de diagonale

Mediu~15 min7 pași

De ce contează?

Trasează două linii diagonale peste un pătrat, dintr-un colț în altul. Se formează patru triunghiuri: sus, jos, stânga, dreapta. O matrice pătratică se împarte la fel — iar fiecare zonă se recunoaște printr-o pereche simplă de condiții pe indici.

Patru zone, două diagonale

Diagonala principală (i == j) și cea secundară (i + j == n − 1) se intersectează la centru și împart matricea în patru triunghiuri. Fiecare celulă din interior cade într-o zonă, în funcție de poziția față de cele două diagonale:

ZonăFață de principalăFață de secundarăCondiție
nord (sus)deasupra (i < j)deasupra (i + j < n−1)i < j && i + j < n-1
sud (jos)sub (i > j)sub (i + j > n−1)i > j && i + j > n-1
vest (stânga)sub (i > j)deasupra (i + j < n−1)i > j && i + j < n-1
est (dreapta)deasupra (i < j)sub (i + j > n−1)i < j && i + j > n-1

Pe o matrice 5×5, zonele arată așa (N/S/E/V; D = pe diagonală):

D N N N D
V D N D E
V V D E E
V D S D E
D S S S D

Implementare C++

#include <iostream>
using namespace std;

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

    long long sNord = 0, sSud = 0, sVest = 0, sEst = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i < j && i + j < n - 1)       sNord += a[i][j];
            else if (i > j && i + j > n - 1)  sSud  += a[i][j];
            else if (i > j && i + j < n - 1)  sVest += a[i][j];
            else if (i < j && i + j > n - 1)  sEst  += a[i][j];
            // i == j sau i + j == n-1 -> pe diagonala, nicio zona
        }
    }
    cout << sNord << " " << sSud << " " << sVest << " " << sEst << "\n";
    return 0;
}
Observația-cheie

Fiecare zonă cere două condiții simultane (poziția față de ambele diagonale). O singură condiție nu ajunge — ar acoperi un sfert greșit. Combinația i < j cu i + j < n-1 fixează exact triunghiul de nord.

De ce condiții stricte

Elementele cu i == j sau i + j == n − 1 sunt pe diagonale — granița dintre zone, nu interiorul lor. Cu condiții stricte (<, >) ele rămân automat în afara celor patru zone. Dacă problema le cere incluse undeva, le tratezi explicit.

Complexitate

OperațieTimpSpațiu
clasificarea tuturor celulelorO(n²)O(1)

O singură parcurgere clasifică fiecare celulă.

Greșeli frecvente

Capcane reale la zonele diagonale:

  • O singură condiție per zonă: folosești doar i < j și prinzi jumătate de matrice, nu triunghiul. Ai nevoie de ambele condiții.
  • Confuzi vest cu est sau nord cu sud: verifică pe desenul 5×5 ce pereche de semne dă fiecare zonă.
  • Incluzi diagonalele din greșeală: cu <= în loc de <, elementele de pe diagonală intră în două zone deodată sau sunt numărate de mai multe ori.
  • Aplici pe matrice nepătratică: zonele clasice sunt definite pentru n×n; la m≠n diagonala secundară nu mai e i + j == n − 1.

Vizualizare

Urmărește cum cele două diagonale taie matricea în patru triunghiuri și ce condiție de indici definește fiecare zonă:

Indiciu

Pune cursorul pe o celulă și verifică cele două condiții (i vs j și i + j vs n−1). Combinația lor îți spune în ce zonă cade.

De reținut

  • Cele două diagonale împart matricea pătratică în 4 zone: nord, sud, vest, est.
  • Fiecare zonă = două condiții simultane pe i < j/i > j și i + j < n−1/i + j > n−1.
  • Folosește condiții stricte; elementele de pe diagonale nu aparțin niciunei zone.

Întrebarea 1 / 3

Cele două diagonale ale unei matrice pătratice împart interiorul în câte zone?