# Vecinii unei celule și bordarea matricei

> Pagina: https://bacalaurescu.ro/informatica/lectii/tablouri-bidimensionale/vecinii-si-bordarea
> Markdown: https://bacalaurescu.ro/informatica/lectii/tablouri-bidimensionale/vecinii-si-bordarea.md
> Sursa: Bacalaurescu (bacalaurescu.ro), conținut gratuit pentru BAC 2027.

Materia: [Informatică](https://bacalaurescu.ro/informatica)

Capitolul: [Tablouri bidimensionale](https://bacalaurescu.ro/informatica/lectii/tablouri-bidimensionale)
Actualizat: 2026-11-01

Tehnica direcțiilor dx/dy și bordarea cu santinelă pentru probleme de vecinătate.

## Pe scurt pentru BAC

- Vecinii pe 4 direcții se parcurg cu vectorii `dx` și `dy` într-o singură buclă `for (int d = 0; d < 4; d++)`.
- Pentru 8 vecini, cu tot cu diagonalele, extinzi vectorii de direcție la 8 perechi.
- Bordarea înconjoară matricea cu un cadru de valori neutre și lucrezi cu indicii de la 1 la n, astfel încât `a[i-1][j]` există mereu.
- Sumele pe vecinătăți, elementele izolate și drumurile în matrice se reduc la dx/dy cu verificarea limitelor sau la bordare.

## Vecinii unei celule

```figure
{
  "height": 230,
  "caption": "Vecinii pe 4 direcții (N, S, E, V) ai celulei centrale. Perechile (dx, dy) codifică deplasarea spre fiecare vecin.",
  "items": [
    { "t": "line", "x1": 100, "y1": 40, "x2": 300, "y2": 40, "color": "muted" },
    { "t": "line", "x1": 100, "y1": 105, "x2": 300, "y2": 105, "color": "muted" },
    { "t": "line", "x1": 100, "y1": 170, "x2": 300, "y2": 170, "color": "muted" },
    { "t": "line", "x1": 133, "y1": 10, "x2": 133, "y2": 200, "color": "muted" },
    { "t": "line", "x1": 200, "y1": 10, "x2": 200, "y2": 200, "color": "muted" },
    { "t": "line", "x1": 267, "y1": 10, "x2": 267, "y2": 200, "color": "muted" },
    { "t": "point", "x": 166, "y": 137, "color": "accent", "label": "(i, j)", "dx": -14, "dy": 22 },
    { "t": "vector", "x1": 166, "y1": 125, "x2": 166, "y2": 82, "label": "N" },
    { "t": "vector", "x1": 166, "y1": 150, "x2": 166, "y2": 192, "label": "S" },
    { "t": "vector", "x1": 180, "y1": 137, "x2": 240, "y2": 137, "label": "E" },
    { "t": "vector", "x1": 152, "y1": 137, "x2": 112, "y2": 137, "label": "V" }
  ]
}
```

Tehnica standard: vectorii de direcție.

```cpp
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, 1, -1};
for (int d = 0; d < 4; d++) {
    int ni = i + dx[d], nj = j + dy[d];
    if (ni >= 0 && ni < n && nj >= 0 && nj < m)
        s += a[ni][nj];
}
```

Pentru 8 vecini (cu diagonale), extinzi vectorii la 8 perechi.

## Bordarea (santinela)

Alternativa elegantă la verificarea limitelor: ÎNCONJORI matricea cu un cadru de valori neutre (0 sau o valoare care nu deranjează) și lucrezi cu indicii 1..n:

```cpp
for (int j = 0; j <= m + 1; j++) a[0][j] = a[n+1][j] = 0;
for (int i = 0; i <= n + 1; i++) a[i][0] = a[i][m+1] = 0;
```

Acum `a[i-1][j]` există întotdeauna pentru i din 1..n: dispar toate condițiile de margine.

## Exemplu rezolvat

Matricea 3×3 cu valorile 1..9 (pe linii). Suma vecinilor pe 4 direcții ai celulei centrale (valoarea 5): vecinii sunt 2 (N), 8 (S), 6 (E), 4 (V): suma **20**.

## Unde apare la BAC

Sume pe vecinătăți, numărarea elementelor "izolate" (mai mari decât toți vecinii), drumuri în matrice, jocuri de viață simplificate: toate se reduc la dx/dy + verificarea limitelor sau bordare.

> [!RETINE]
> dx/dy transformă 4 (sau 8) cazuri copy-paste într-o buclă de 4 (8) pași. Bordarea cu 0 elimină complet verificările de margine la sume.

## Greșeli frecvente

1. Fără verificarea limitelor, colțurile citesc memorie din afara matricei.
2. La bordare, valorile santinelei trebuie NEUTRE pentru operație (0 la sumă, dar -infinit la maxim!).
3. Perechile dx/dy se parcurg sincron: dx[d] cu dy[d], nu combinații încrucișate.
