# PBinfo #4729 – Matrice20 – Rezolvare C++

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

## Enunț

Cerința
Se consideră o matrice pătratică cu n linii şi n coloane şi elemente numere naturale distincte. Cele două diagonale delimitează în matrice 4 zone:


NORD – elementele situate deasupra diagonalei principale şi deasupra celei secundare
EST – elementele situate deasupra diagonalei principale şi sub cea secundară
SUD – elementele situate sub diagonala principală şi sub cea secundară
VEST – elementele situate sub diagonala principală şi deasupra celei secundare

Să se determine cele 4 maxime din zonele determinate de cele două diagonale și să se calculeze cel mai mare divizor comun al lor. 

Se vor defini și apela următoarele subprograme:


citire, care citește de la tastatură valoarea lui n și elementele matricei
cmmdc, care calculează cel mai mare divizor comun al două numere
maxime, care determină cele 4 maxime din zonele determinate de cele două diagonale și le furnizează prin parametri referință. Această funcție poate fi înlocuită cu 4 funcții, câte una pentru fiecare maxim din cele 4 zone din matrice

În programele C/C++ nu se vor folosi variabile globale.

Date de intrare
Programul citește de la tastatură numărul n, iar apoi n*n numere naturale, separate prin spaţii, reprezentând elementele matricei, linie cu linie.

Date de ieșire
Programul afișează pe ecran cel mai mare divizor comun al celor 4 maxime din zonele determinate de cele două diagonale.

Restricții și precizări

1 ≤ n ≤ 50
elementele matricei sunt mai mici decât 100000 și sunt distincte

Exemplu:
Date de intrare

5
22 10 11 16 17 
4 19 1 8 20  
29 12 3 5 6 
36 7 9 24 15 
13 23 28 14 2
Date de ieșire

4
Explicație
Valorile maxime din cele 4 zone sunt 16 (din nord), 20 (din est) 28 (din sud) și 36 (din vest) iar cel mai mare divizor comun al numerelor 16, 20, 28 și 36 este 4.

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
void citire(int A[][101], int &n)
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>A[i][j];
}
void maxime(int A[][101], int n, int &maxN, int &maxE, int &maxS, int &maxV)
{
    maxN=0,maxE=0,maxS=0,maxV=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(i<j && i+j<n+1 && A[i][j]>maxN) maxN=A[i][j];
            if(i<j && i+j>n+1 && A[i][j]>maxE) maxE=A[i][j];
            if(i>j && i+j>n+1 && A[i][j]>maxS) maxS=A[i][j];
            if(i>j && i+j<n+1 && A[i][j]>maxV) maxV=A[i][j];
        }
}
int cmmdc(int a, int b)
{
    while(b!=0)
    {
        int r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int main()
{
    int A[101][101],n,maxN,maxE,maxS,maxV;
    citire(A,n);
    maxime(A,n,maxN,maxE,maxS,maxV);
    cout<<cmmdc(cmmdc(maxN,maxE),cmmdc(maxS,maxV));
    return 0;
}
```

## Resurse

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