De ce contează?
Tragi cele două diagonale ale unui pătrat și obții patru triunghiuri: unul în sus, unul în jos, unul la stânga, unul la dreapta — ca un plic. Multe probleme cer să prelucrezi doar una dintre aceste zone. Trebuie să știi, pentru fiecare căsuță, în ce triunghi cade.
Cele patru zone
Cele două diagonale ale unei matrice pătratice o împart în patru triunghiuri: nord (sus), sud (jos), vest (stânga), est (dreapta).
Plasarea unui element a[i][j] se face comparând cu cele două diagonale:
- față de principala:
i < j(deasupra) saui > j(dedesubt) - față de secundara:
i + j < n-1(deasupra) saui + j > n-1(dedesubt)
Combini cele două comparații ca niște coordonate:
- Sus:
i < jșii + j < n-1 - Jos:
i > jșii + j > n-1 - Stânga:
i > jșii + j < n-1 - Dreapta:
i < jșii + j > n-1
Exemplu pe numere
Matricea 5×5, fiecare zonă marcată: 1=sus, 2=jos, 3=stânga, 4=dreapta, 0=pe diagonale:
| L0 | 0 | 1 | 1 | 1 | 0 |
| L1 | 3 | 0 | 1 | 0 | 4 |
| L2 | 3 | 3 | 0 | 4 | 4 |
| L3 | 3 | 0 | 2 | 0 | 4 |
| L4 | 0 | 2 | 2 | 2 | 0 |
Implementare C++
#include <iostream>
using namespace std;
int a[100][100];
int main() {
int n;
cin >> n; // matrice patratica
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
int sumaSus = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (i < j && i + j < n - 1) // zona de sus: deasupra ambelor diagonale
sumaSus += a[i][j];
cout << "Suma zonei de sus = " << sumaSus << "\n";
return 0;
}Pentru altă zonă schimbi doar condiția (i > j && i + j > n - 1 pentru jos, etc.).
Complexitate
| Operație | Timp | Spațiu |
|---|---|---|
| Parcurgerea unei zone | O(n²) | O(1) |
Parcurgi toată matricea și verifici apartenența fiecărui element la zonă.
Vizualizare
Urmărește cum cele două diagonale împart matricea în patru triunghiuri — sus, jos, stânga, dreapta:
Greșeli frecvente de concurs:
- Incluzi diagonalele din greșeală. Elementele de pe diagonale (
i == jsaui + j == n-1) nu sunt în niciun triunghi. Folosește<și>stricte, nu<=. - Confunzi zonele. Sus =
i < j && i + j < n-1. Ușor de încurcat cu stânga (i > j && i + j < n-1). Verifică pe un exemplu mic. - Aplici pe matrice nepătratică. Cele două diagonale și cele 4 zone simetrice sunt definite pe matrice pătratică. La
n ≠ mdefiniția zonelor nu mai e simetrică. - Centrul la
nimpar. Lanimpar, centrul e pe ambele diagonale — nu aparține niciunei zone. Tratează-l separat dacă problema o cere.
Recapitulare
- Cele două diagonale taie matricea pătratică în 4 triunghiuri: sus, jos, stânga, dreapta.
- Plasezi un element comparând
icuj(principala) șii+jcun-1(secundara). - Folosește inegalități stricte ca să excluzi diagonalele; definiția cere matrice pătratică.