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 DImplementare 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;
}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ție | Timp | Spațiu |
|---|---|---|
| clasificarea tuturor celulelor | O(n²) | O(1) |
O singură parcurgere clasifică fiecare celulă.
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; lam≠ndiagonala secundară nu mai ei + 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ă:
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șii + j < n−1/i + j > n−1. - Folosește condiții stricte; elementele de pe diagonale nu aparțin niciunei zone.