# PBinfo #2966 – yinyang – Rezolvare C++

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

## Enunț

Se dă o matrice A cu N linii și M coloane, cu valori cuprinse între 1 și N∙M inclusiv, nu neapărat distincte. O operație constă în selectarea a două linii sau două coloane consecutive și interschimbarea acestora (swap). O matrice yin-yang este o matrice în care A[ i ] [ j ] ≥ A[ i ][ j – 1], pentru orice pereche (i, j) cu 1 ≤ i ≤ N și 2 ≤ j ≤ M și A[ i ][ j ] ≥ A[ i – 1][ j ], pentru orice pereche (i, j) cu 2 ≤ i ≤ N și 1 ≤ j ≤ M.

Cerința
Să se determine numărul minim de operații necesare pentru a transforma matricea dată într-o matrice yin-yang.

Date de intrare
În fișierul de intrare yinyang.in se află scrise pe prima linie numerele naturale N și M, cu semnificația din enunț. Pe fiecare dintre următoarele N linii se află câte M numere naturale, reprezentând elementele matricei date A. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.

Date de ieșire
În fișierul yinyang.out se va scrie numărul minim de operații cerut sau -1 dacă nu există soluție.

Restricții și precizări

1 ≤ N, M ≤ 100
Pentru teste în valoare de 9 puncte: 1 ≤ N, M ≤ 5
Pentru alte teste în valoare de 18 puncte: N = 1
Pentru alte teste în valoare de 36 de puncte elementele din matrice sunt DISTINCTE

Exemplu:
yinyang.in

2 3
1 2 4
3 5 6
yinyang.out

0
Explicație
Matricea dată este matrice yin-yang.

yinyang.in

2 3
6 6 5
4 6 2
yinyang.out

3
Explicație
Operațiile pot fi următoarele:
swap(linia 1 , linia 2),
swap(coloana 2, coloana 3),
swap(coloana 1, coloana 2).
Matricea dată va ajunge la final în forma yin-yang:

## Cod sursă C++

```cpp
///yin-yang
///O(n*m*(n+m))
#include<stdio.h>
int n,m,a[1002][1002],i,j,k,x,nr,c1,c2;
int main(){
    FILE *fin,*fout;
    fin= fopen("yinyang.in","rt");
    fout=fopen("yinyang.out","wt");
    fscanf(fin,"%d %d\n",&n,&m);
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            fscanf(fin,"%d ",&x);
            a[i][j]=x;
        }
    }
    nr=0;
    for(i=1;i<=n-1;i++){
        for(j=i+1;j<=n;j++){
            int r=0;c1=0;c2=0;
            for(k=1;k<=m;k++){
                if(a[i][k]<a[j][k]){
                    if(r==0)r=-1;
                    c1++;
                }
                if(a[i][k]>a[j][k]){
                    if(r==0)r=+1;
                    c2++;
                }
            }
            if(c1 && c2){fprintf(fout,"-1");fclose(fout);fclose(fin);return 0;}
            if(r>0)nr++;
        }
    }
    for(i=1;i<=m-1;i++){
        for(j=i+1;j<=m;j++){
            int r=0;c1=0;c2=0;
            for(k=1;k<=n;k++){
                if(a[k][i]<a[k][j]){
                    if(r==0)r=-1;
                    c1++;
                }
                if(a[k][i]>a[k][j]){
                    if(r==0)r=+1;
                    c2++;
                }
            }
            if(c1 && c2){fprintf(fout,"-1");fclose(fout);fclose(fin);return 0;}
            if(r>0)nr++;
        }
    }
    fprintf(fout,"%d",nr);
    fclose(fout); fclose(fin);
    return 0;
}
```

## Resurse

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