Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1350 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Rotation dans une matrice : problèmes !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Rotation dans une matrice : problèmes !

n°564839
drvins
Posté le 12-11-2003 à 13:29:36  profilanswer
 

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
mood
Publicité
Posté le 12-11-2003 à 13:29:36  profilanswer
 

n°565155
drvins
Posté le 12-11-2003 à 18:17:35  profilanswer
 

UP :cry:

n°565255
Carbon_14
Posté le 12-11-2003 à 20:39:12  profilanswer
 

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 ?

n°565491
Happy Life
Posté le 12-11-2003 à 23:47:19  profilanswer
 

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é

n°565896
Carbon_14
Posté le 13-11-2003 à 15:06:27  profilanswer
 

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 ?

n°593628
ACut
Posté le 18-12-2003 à 17:35:08  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Rotation dans une matrice : problèmes !

 

Sujets relatifs
Problèmes de chargement d'extension Easyphp1.7matrice, fonction
[C++]Réduction zone de travail dans une matriceLes problèmes de qualité reliés au code
Code pour un pop-up marche pas sur IE et a des problèmes sur MozillaColoration syntaxique de C++ vers du HTML, problèmes ....
Problemes avec pointeurs/tableaux adresses[C++] Problèmes à la compilation avec des fonctions amies
Rotation d'images pour page d'acceuil[jbuilder] problemes de double buffering
Plus de sujets relatifs à : Rotation dans une matrice : problèmes !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR