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

URGENT!!! CU RECURSIVITATE!!! PLS!!!
George, mare pasionat de artă, a primit un desen și acum încearcă să descifreze tainele acestuia. Pe scurt, îl tot rotește spre dreapta și spre stânga pentru a încerca să îl vizualizeze mai bine. Sătul să îl mai privească, Jon, prietenul său la fel de pasionat de artă, ii spune că pentru a descifra tabloul, trebuie să îl rotească spre stânga cu 90 de grade de k ori.

Neînțelegând indicațiile primite, George vă cere vouă ajutorul. Ca să îi vii în ajutor, scrie o funcție ce rotește un tablou bidimensional (matrice) cu 90o la stânga de k ori.

Restricții și precizări
Numele funcției este rotireMatStg
Funcția va avea 4 parametri: n și m, de tip int, semnificând numărul de linii, respectiv coloane ale matricei; a, reprezentând tabloul bidimensional și k, un număr întreg cu semnificația din enunț
Primii doi parametri(n și m) sunt și parametri de ieșire, deoarece întorc noua dimensiune a tabloului
Matricea finală va fi întoarsă prin intermediul parametrului ce memorează matricea inițială
1 ≤ n, m < 1 000
1 ≤ k ≤ 1 000 000
Elementele matricei vor fi numere naturale mai mici decât 1 000 000
Pentru ca programul să funcționeze fără erori, matricea trebuie să fie de 1 000 x 1 000 și indexată de la 1:
void rotireMatStg(int &n, int &m, int a[1000][1000], int k)
Dacă ai nevoie de matrice în plus, declară-le înainte să declari funcția.

Răspunsuri la întrebare

Răspuns de Sergetec
2

Salut!

Ai functia mai jos in C++

int b[1000][1000];

void rotireMatStg(int &n, int &m, int a[1000][1000], int k) {

   if (k % 4 == 0 || k == 0) {

       return;

   }

   for (int i = 1; i <= n; ++i) {

       for (int j = 1; j <= m; ++j) {

           b[m+1-j][i] = a[i][j];

       }

   }

   swap(n, m);

   for (int i = 1; i <= n; ++i) {

       for (int j = 1; j <= m; ++j) {

           a[i][j] = b[i][j];

       }

   }

   rotireMatStg(n, m, a, k - 1);

}

Explicatie:

Daca k = 4 sau se imparte exact la 4, inseamna ca facem unul sau mai multe cercuri complete (360°), asadar nu este nevoie intoarcerea matricei. In cazul cand k = 0, inseamna ca am efectuat toate rotirile, deoarece in apelul recursiv ii dam k-1.

Pentru ca in final sa avem n si m schimbate, folosim functia swap(n, m) care va interschimba valoarea celor 2 variabile la fiecare rotire inainte de copiere in matricea originala.


GAGA135: Esti cel mai tare. Nici nu stii de cand ma chinui la ceasta problema! Mssss mult!
Alte întrebări interesante