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

Buna! Ma puteti ajuta cu implementarea functiei pentru rotirea matricei?
Enuntul este urmatorul:

Se dă o matrice pătratică a[n][n] cu elemente formate din caractere din alfabetul latin.
Să se rotească elementele matricei în sens trigonometric, folosind spaţiu suplimentar
de memorie constant.


boiustef: la ce unghi e rotirea? pentru matricea:
00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33
care este rezultatul?
chiriacmoruzzi: La 90 de grade, in sensul acelor de ceasornic.

30 20 10 00
31 21 11 01
32 22 12 02
33 23 13 03
boiustef: Sens orar sau sensul acelor de ceasornic este identic cu cel descris de limbile ceasului: de sus spre dreapta, jos, apoi spre stânga și înapoi sus. Sensul opus rotirii în sens orar este sensul antiorar , denumit în matematică și sens trigonometric
boiustef: totuşi rotirea e antiorar....

Răspunsuri la întrebare

Răspuns de boiustef
0

Răspuns:

#include <iostream>

using namespace std;

int n,i,j,iss,jss,idj,jdj, k,m;

char a[40][40], ch, b[40],c[40];

int main()

{

   cout << "n= !"; cin >> n;

   cout << "introdu " << n << " linii cu " << n << " caractere pe linie separate prin spatiu"  << endl;

   for (i=0; i<n; ++i)

   {

       for (j=0; j<n; ++j)

       {

           cin >> ch;

           a[i][j]=ch;

       }

   }

   iss=0; jss=0; idj=n-1; jdj=n-1;

   while (jss<jdj)

   {

       k=0;

       for (i=iss+1; i<=idj; ++i) b[k++]=a[i][jss];

       m=0;

       for (j=jss; j<jdj; ++j) c[m++]=a[iss][j];

       m=0;

       for (i=idj; i>iss; --i) a[i][jss]=c[m++];

       m=0;

       for (i=iss; i<idj; ++i) c[m++]=a[i][jdj];

       m=0;

       for (j=jss; j<jdj; ++j) a[iss][j]=c[m++];

       m=0;

       for (j=jss+1; j<=jdj; ++j) c[m++]=a[idj][j];

       m=0;

       for (i=idj-1; i>=iss; i--) a[i][jdj]=c[m++];

       k=0;

       for (j=jss+1; j<=jdj; ++j) a[idj][j]=b[k++];

       ++iss; ++jss; --idj; --jdj;

   }

   cout << "\n \n";

   for (i=0; i<n; ++i)

   {

       for (j=0; j<n; ++j)

           cout << a[i][j] << " ";

       cout << "\n";

   }

   return 0;

}

Explicație:

PARCĂ E BINE...

am folosit doi vectori liniari auxiliari b şi c unde pun elementele matricei pentru a nu le perde la rotire. Variabilele iss, jss, idj, jdj folosite pentru idicii colţului stânga sus şi dreapta jos a chenarului ce se roteşte. Se putea folosi numai un vector auxiliar dar mi+a părut complicată relaţia dintre indicii elementelor de unde iau şi unde pun că să obţinem rotirea.  

Alte întrebări interesante