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 suntDISTINCTE
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 .
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!