# PBinfo #4218 – MatrixHasYou – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerinţa
Scrieţi definiția completă a subprogramului C++ cu antetul:

void Matrix(int a[300][300], int n, int L[], int C[], int k)
Subprogramul primește ca parametri:

a – matrice cu n linii (numerotate de la 0 la n-1) și n coloane (numerotate de la 0 la n-1)
n – numărul de linii și coloane
L – un vector de k elemente, numere naturale cuprinse între 0 și n-1
C – un vector tot de k elemente, numere naturale cuprinse între 0 și n-1


Inițial matricea a memorează numai valori de 0.
Se efectuează asupra matricei pe rând, în această ordine, operațiile L[0], C[0],  L[1], C[1],  L[2], C[2], …,  L[k-1], C[k-1]. Operația L[i] se efectuează asupra elementelor liniei L[i] din matrice și modifică orice valoare 0 în 1 și orice valoare 1 în 0. Similar, operația C[i] se efectuează asupra elementelor coloanei C[i] din matrice și modifică orice valoare 0 în 1 și orice valoare 1 în 0. Matricea a va reține în final valorile care se obțin după efectuarea tuturor operațiilor.

De exemplu, dacă n=4 L=(1,3) și C=(2,0), atunci, știind că matricea este inițial 0 peste tot, aceasta se va transforma astfel:

după operația L[0]=1:
0 0 0 0
1 1 1 1
0 0 0 0
0 0 0 0

după operația C[0]=2:
0 0 1 0
1 1 0 1
0 0 1 0
0 0 1 0

după operația L[1]=3:
0 0 1 0
1 1 0 1
0 0 1 0
1 1 0 1

după operația C[1]=0:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

Aceasta este matricea finală.

Restricţii şi precizări

3 ≤ n ≤ 300
1 ≤ k ≤ 5000
elementele vectorilor L și C sunt indexate de la 0
valorile din vectorii L și C nu sunt neapărat distincte
Puteți utiliza în rezolvare orice structură de date

Important
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.

## Cod sursă C++

```cpp
void Matrix(int a[300][300], int n, int L[], int C[], int k)
{
    int i, j;
    int lin[302] = {0};
    int col[302] = {0};
    for (i = 0; i < k; i++)
        lin[L[i]] = 1 - lin[L[i]];
    for (i = 0; i < k; i++)
        col[C[i]] = 1 - col[C[i]];
    /// operatiile pe linii
    for (i = 0; i < n; i++)
        if (lin[i] == 1) /// aplic operatia pe linia i
            for (j = 0; j < n; j++)
                a[i][j] = 1 - a[i][j];
    /// operatiile pe coloane
    for (i = 0; i < n; i++)
        if (col[i] == 1) /// aplic operatia pe linia i
            for (j = 0; j < n; j++)
                a[j][i] = 1 - a[j][i];
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4218)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4218/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4218/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
