Rotation dans une matrice : problèmes !

Rotation dans une matrice : problèmes ! - C++ - Programmation

Marsh Posté le 12-11-2003 à 13:29:36    

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 :
  1. #include <iostream>
  2. using namespace std;
  3. int const MAX = 100;
  4. void ReadMat(int A[MAX][MAX], int n)
  5. {
  6. for(int i=0 ; i<n ; i++)
  7.  for(int j=0 ; j<n ; j++)
  8.   cin >> A[i][j];
  9. }
  10. void PrintMat(int A[MAX][MAX], int n)
  11. {
  12. for(int i=0 ; i<n ; i++)
  13. {
  14.  for(int j=0 ; j<n ; j++)
  15.   cout << A[i][j] << " ";
  16.  cout << endl;
  17. }
  18. }
  19. void LeftDiagRot(int A[MAX][MAX], int n, int k)
  20. {
  21. int i, j, cpt =0;
  22. int ligne=0;
  23. int colonne = n-1;
  24. while (cpt<n)
  25. {
  26.  int Save = A[ligne][colonne];
  27.  for (i=0 ; (i+k)%n != ligne ; i=(i+k)%n)
  28.   for (j=0 ; (j+k)%n != ligne ; j=(j+k)%n)
  29.   {
  30.    A[i][j]=A[(i+k)%n][(j+k)%n];
  31.    colonne--;
  32.    cpt++;
  33.   }
  34.  A[i][j] = Save;
  35.  colonne--;
  36.  cpt++;
  37.  ligne++;
  38. }
  39. }
  40. int main (void)
  41. {
  42. int n, k, A[MAX][MAX];
  43. cin >> n >> k;
  44. ReadMat(A,n);
  45. cout << endl;
  46. PrintMat(A,n);
  47. cout << endl;
  48. LeftDiagRot(A,n,k);
  49. PrintMat(A,n);
  50. return 0;
  51. }


 
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
Reply

Marsh Posté le 12-11-2003 à 13:29:36   

Reply

Marsh Posté le 12-11-2003 à 18:17:35    

UP :cry:

Reply

Marsh Posté le 12-11-2003 à 20:39:12    

Pour mieux comprendre le pb : dans l'exemple donné, seules bougent les diagonales contenant le "bloc" désigné  
 
00 01 02 XX XX
05 06 07 08 XX
10 11 12 13 14
XX 16 17 18 19
XX XX 22 23 24
 
donc les XX sont figés ?

Reply

Marsh Posté le 12-11-2003 à 23:47:19    

dans ce cas précis ca me parait logique ques les X soient figés, car k = 2, et card(deuxieme diagonale) = 2 donc transition invisible,  
card(premiere diagonale) = 1, meme chose...
 
je pense pas que ca soit figé, c'est juste dans cet exemple particulier que ca reste figé

Reply

Marsh Posté le 13-11-2003 à 15:06:27    

C'était pour faire avancer le schmilibilick, et me replonger dans les matrices (ça fait 25 ans que j'y touche plus).
Personne n'a trouvé son bug ?

Reply

Marsh Posté le 18-12-2003 à 17:35:08    

DrVins a écrit :


 
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++;
 
 }
}


Ce code est une aberration:
- pourquoi (j+k)%n est-il comparé à ligne dans la boucle de j?
- pourquoi "colonne--" alors que colonne est inutilisé dans la boucle?
 
 
Ca risque pas de fonctionner!
Il serait plus simple de:
 
1) indexer les diagonales à rotater. Elles sont au nombre de 2N-1 (en fait 2N-3 car les points (0,N-1) et (N-1,0) ne bougent pas dans la matrice qqsoit k). Il suffit donc de considérer 2N-3 fois un pointeur "diag" (de dimension 1 et de largeur comprise entre 2 et N)
 
2) à chaque passe, on fournit "diag" à une fonction qui opère proprement la rotation de k élems vers la gauche.
 
Une fois que cette logique est bien posée, y a plus qu'à bosser directement sur int** A avec les offsets appropriés.


Message édité par ACut le 18-12-2003 à 20:06:04

---------------
NOUVEAU! Le guide de l'édition en version ebook : http://marcautret.free.fr/autret/150q-ebook/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed