👤

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.


Răspuns :

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.