Rezolvare completă PbInfo #2966 yinyang

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:

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema yinyang:

///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;
}




Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2966 yinyang

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2966 yinyang de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!