# PBinfo #3343 – PatratMagic3 – Rezolvare C++

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

## Enunț

Un Pătrat Magic este un pătrat ce conține toate numerele de la 1 la n 2 în care sumele fiecăror linii, coloane și a celor două diagonale sunt egale. Această sumă se mai numește și constanta pătratului magic.


Cerința
Se dă un număr natural n, de forma n = 4k+2. Să se genereze și să se afișeze un pătrat magic de latură n.

Date de intrare
Programul citește de la tastatură numărul n.

Date de ieșire
Programul afișează pe ecran pătratul magic construit, câte o linie a matricei pe câte o linie a ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu.

Restricții și precizări

1 < n < 100
n va fi de forma 4k+2, k număr natural
orice rezultat corect va fi punctat

Exemplu:
Intrare

6
Ieșire

16 13 36 33 8 5 
14 15 34 35 6 7 
12 9 17 20 28 25 
10 11 18 19 26 27 
29 32 4 1 21 24 
30 31 2 3 22 23

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
int n;
int a[101][101];
void gen_impar(int n, int a[][101]){
    int c;
    c = (n*n*n + n)/2;
    int nr = 1;
    /// general
    for(int x = 0, y = n-1;x<n;++x, --y)
        for(int i=x, j=y;i<x+n;++i, ++j)
            a[i][j] = nr++;
    /// N
    for(int x=0, y=n-1;x<n/2;++x, --y)
        for(int j=y, cnt=0;cnt<=x;j+=2, ++cnt)
            a[x+n][j] = a[x][j], a[x][j]=0; /// sau swap
    /// S
    for(int x=2*(n-1), y=n-1, ln = 0;x>=n+n/2;--x, --y, ++ln)
        for(int j=y, cnt=0;cnt<=ln;j+=2, ++cnt)
            a[x-n][j] = a[x][j], a[x][j]=0;
    /// V
    for(int x = n-1, y = 0;y<n/2;--x, ++y)
        for(int i=x, cnt=0; cnt<=y; i+=2, ++cnt)
            a[i][y+n] = a[i][y], a[i][y] = 0;
    /// E
    for(int x = n-1, y = 2*(n-1), ln = 0;y>=n+n/2;--x, --y, ++ln)
        for(int i=x, cnt=0; cnt<=ln; i+=2, ++cnt)
            a[i][y-n] = a[i][y], a[i][y] = 0;
    /// transpunere din (n/2, n/2) in (0, 0)
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
            a[i][j] = a[i+n/2][j+n/2];
}
int main()
{
    int b[101][101]; /// indici
    cin>>n;
    gen_impar(n/2, b);
    /// generam matricea tip
    char tip[51][51];
    int k = n/4+1;
    for(int i=0;i<k;++i)
        for(int j=0;j<n/2;++j)
            tip[i][j] = 'L';
    for(int j=0;j<n/2;++j)
        tip[k][j] = 'U';
    for(int i=k+1;i<n/2;++i)
        for(int j=0;j<n/2;++j)
            tip[i][j] = 'X';
    swap(tip[n/4][n/4], tip[n/4+1][n/4]);
    /// generam matricea rezultat
    for(int i=0, x=0;i<n;i+=2, ++x)
        for(int j=0, y=0;j<n;j+=2, ++y)
    {
        if(tip[x][y] == 'L')
        {
            a[i][j] = 4*b[x][y];
            a[i+1][j+1] = 4*b[x][y]-1;
            a[i+1][j] = 4*b[x][y]-2;
            a[i][j+1] = 4*b[x][y]-3;
        }
        else if(tip[x][y] == 'U')
        {
            a[i][j] = 4*b[x][y]-3;
            a[i+1][j+1] = 4*b[x][y]-1;
            a[i+1][j] = 4*b[x][y]-2;
            a[i][j+1] = 4*b[x][y];
        }
        else if(tip[x][y] == 'X')
        {
            a[i][j] = 4*b[x][y]-3;
            a[i+1][j+1] = 4*b[x][y]-2;
            a[i+1][j] = 4*b[x][y]-1;
            a[i][j+1] = 4*b[x][y];
        }
    }
    for(int i=0;i<n;++i, cout<<'\n')
        for(int j=0;j<n;++j)
            cout<<a[i][j]<<' ';
    return 0;
}
```

## Resurse

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