drvins | Salut, j'ai un problème dans un exo sur les matrices, il s'agit de faire une rotation vers la gauche de k éléments dans une matrice n sur n...
exemple avec k = 2 :
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
devient 12 13 14 3 4
17 18 19 2 9
22 23 24 1 8
15 10 5 0 7
20 21 16 11 6
Je doit donc faire un déplacement de k positions sur la gauche sur chaque diagonale de la matrice.
Si je prend la diagonale centrale :
0
6
12
18
24
avec k = 2, ça devient :
12
18
24
0
6
et je dois faire ça pour chaques diagonales.
Voilà mon code :
Code :
- #include <iostream>
- using namespace std;
- int const MAX = 100;
- void ReadMat(int A[MAX][MAX], int n)
- {
- for(int i=0 ; i<n ; i++)
- for(int j=0 ; j<n ; j++)
- cin >> A[i][j];
- }
- void PrintMat(int A[MAX][MAX], int n)
- {
- for(int i=0 ; i<n ; i++)
- {
- for(int j=0 ; j<n ; j++)
- cout << A[i][j] << " ";
- cout << endl;
- }
- }
- void LeftDiagRot(int A[MAX][MAX], int n, int k)
- {
- int i, j, cpt =0;
- int ligne=0;
- int colonne = n-1;
- while (cpt<n)
- {
- int Save = A[ligne][colonne];
- for (i=0 ; (i+k)%n != ligne ; i=(i+k)%n)
- for (j=0 ; (j+k)%n != ligne ; j=(j+k)%n)
- {
- A[i][j]=A[(i+k)%n][(j+k)%n];
- colonne--;
- cpt++;
- }
- A[i][j] = Save;
- colonne--;
- cpt++;
- ligne++;
- }
- }
- int main (void)
- {
- int n, k, A[MAX][MAX];
- cin >> n >> k;
- ReadMat(A,n);
- cout << endl;
- PrintMat(A,n);
- cout << endl;
- LeftDiagRot(A,n,k);
- PrintMat(A,n);
- return 0;
- }
|
et j'obtiens :
12 13 14 3 11
17 18 19 6 16
22 23 24 13 21
15 16 17 4 19
7 8 9 23 6
En gros, le code que j'ai fait est censé effectuer la rotation dans la moitié de la matrice, ça je le comprendrais, mais là, je pige pas bien et donc je ne peux pas continuer pour la seconde moitié... Message édité par drvins le 12-11-2003 à 18:09:19
|