Matrice împărțită în patru cadrane, cu cruce pe mijloc
Enunț
Se citește un număr natural impar n (n < 100). Construiți și afișați o matrice pătratică cu n
linii și n coloane după modelul de mai jos.
Pentru n = 5 se afișează:
1 1 5 2 2
1 1 5 2 2
5 5 5 5 5
4 4 5 3 3
4 4 5 3 3
Rezolvare
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int m = n / 2; // indicele liniei si coloanei din mijloc
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == m || j == m) cout << n << " "; // crucea
else if (i < m && j < m) cout << 1 << " "; // stanga-sus
else if (i < m && j > m) cout << 2 << " "; // dreapta-sus
else if (i > m && j > m) cout << 3 << " "; // dreapta-jos
else cout << 4 << " "; // stanga-jos
}
cout << "\n";
}
return 0;
}Cum funcționează
Problema pare complicată până observi că matricea are cinci zone, iar fiecare element aparține
exact uneia. Odată ce le identifici, rezolvarea e o listă de if-uri.
n e impar, deci există o linie și o coloană exact la mijloc: indicele m = n / 2 (împărțire
întreagă — pentru n = 5 dă 2). Ele formează crucea, care se umple cu valoarea n.
Restul matricei rămâne împărțit în patru cadrane, numerotate în sensul acelor de ceasornic pornind din stânga-sus:
1 | 2 i < m, j < m -> 1
--+-- i < m, j > m -> 2
4 | 3 i > m, j > m -> 3
i > m, j < m -> 4
Ordinea if-urilor contează. Crucea se testează prima, pentru că elementele ei ar intra altfel
în condițiile cadranelor. După ce ai eliminat cazul i == m || j == m, rămâne garantat i != m și
j != m, deci comparațiile stricte (<, >) acoperă tot ce a rămas — nu mai e nevoie de un al
cincilea else if.
Tiparul ăsta — împarte matricea în zone, scrie condiția fiecăreia, testează-le în ordinea corectă — rezolvă toate problemele de construcție „după model". Partea grea nu e codul, e citirea atentă a exemplului.
Greșeli frecvente
- Testarea cadranelor înaintea crucii — mijlocul se umple cu
1,2,3sau4în loc den, pentru că primulifcare se potrivește câștigă. <=în loc de<la cadrane — elementele de pe cruce sunt prinse de două ori și rezultatul depinde de ordine.m = n / 2 + 1— pe indici care încep de la0, mijlocul en / 2. Pentrun = 5, pozițiile sunt0..4, iar mijlocul e2, nu3.- Numerotarea cadranelor în sens trigonometric — dă
1 2 / 3 4în loc de1 2 / 4 3. Modelul din enunț e singura sursă; nu presupune.
Apariții
- Galati 2026 — problema 15 · sursa oficială
Sursa fișei: atestia.ro/subiecte/programare/matrice-cadrane-si-cruce — subiecte de atestat la informatică, cu rezolvări explicate.