Informatică, întrebare adresată de claudianastasiu, 8 ani în urmă

Se dă o matrice mt cu n linii și m coloane. Să se rotească o submatrice pătratică dată cu 90 de grade spre stânga.


Date de intrare

De pe prima linie se citesc de la tastatură numerele n și m. De pe următoarele n linii se citesc m numere naturale care reprezintă elementele matricei. De pe ultima linie se citesc numerele i, j și l. i și j reprezintă linia și coloana colțului din stânga sus a submatricei. l reprezintă numărul de linii și de coloane al submatricei.


Date de ieșire

Programul va afișa pe ecran matricea rezultată în urma rotirii.


Restricții și precizări

1 ≤ n, m ≤ 50

1 ≤ mt[i][j] ≤ 3 000

1 ≤ i ≤ n,

1 ≤ j ≤ m

1 ≤ i + l - 1 ≤ n

1 ≤ j + l - 1 ≤ m

Liniile și coloanele matricei sunt numerotate începând de la 1

EXEMPLUL
Date de intrare
4 4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
2 2 2

Date de iesire
1 2 3 4
5 7 11 8
9 6 10 12
13 14 15 16


andrei750238: Ce limbaj ?
claudianastasiu: C++

Răspunsuri la întrebare

Răspuns de andrei750238
3

#include <iostream>

using namespace std;

int mt[51][51], aux[51][51];

//Functie pentru afisarea matricei cu n linii si m coloane

void afisare_matrice(int mat[51][51], int n, int m) {

   for (int linie = 0; linie < n; ++linie) {

       for (int coloana = 0; coloana < m; ++coloana) {

           cout << mat[linie][coloana] << " ";

       }

       cout << '\n';

   }

}

int main() {

   int n, m, i, j, l;

   cin >> n >> m;

   

   //Citeste matrice

   for (int row = 0; row < n; ++row) {

       for (int column = 0; column < m; ++column) {

           cin >> mt[row][column];

       }

   }

   //Citeste poz submatr

   cin >> i >> j >> l;

   --i;

   --j;

   //Copiaza submatricea separat

   for (int linie = i; linie <= i + l; ++linie) {

       for (int coloana = j; coloana <= j + l; ++coloana) {

           aux[linie-i][coloana-j] = mt[linie][coloana];

       }

   }

   //Transpune submatricea

   for (int linie = 0; linie < l; ++linie) {

       for (int coloana = 0; coloana < linie; ++coloana) {

           swap(aux[linie][coloana], aux[coloana][linie]);

       }

   }

   //Copiaza matricea transpusa de jos in sus pe coloane in matricea originala

   for (int coloana = 0; coloana < l; ++coloana) {

       for (int linie = 0; linie < l; ++linie) {

           mt[i + linie][j + coloana] = aux[l - linie-1][coloana];

       }

   }

   afisare_matrice(mt, n, m);

   return 0;

}

► Explicatie :

◘ Copiem submatricea separat, o rotim la 90 de grade spre stanga si apoi o lipim la loc.

◘ Putem roti o matrice la 90 de grade spre stanga astfel :

  • O transpunem
  • O scriem de jos in sus (Inversam prima linie cu ultima, a doua linie cu penultima, a treia cu a treia de la sfarsit, etc. )


claudianastasiu: Esti cel mai tare!
tudorspidy: salut
cum pot face transpusa fara swap?
Alte întrebări interesante