Comment faire pivoter une matrice N x N de 90 degrés. Je veux que ce soit inplace?Comment faire pivoter une matrice N x N de 90 degrés?
Répondre
for(int i=0; i<n/2; i++)
for(int j=0; j<(n+1)/2; j++)
cyclic_roll(m[i][j], m[n-1-j][i], m[n-1-i][n-1-j], m[j][n-1-i]);
void cyclic_roll(int &a, int &b, int &c, int &d)
{
int temp = a;
a = b;
b = c;
c = d;
d = temp;
}
Remarque Je n'ai pas testé , vient de composer maintenant sur place. S'il vous plaît tester avant de faire quoi que ce soit avec.
pourriez-vous expliquer comment avez-vous trouvé les index? –
Expliquer les index .. eh bien, pensez où l'emplacement à (i, j) va en tournant de 90 degrés. Imaginez le picutre. (i, j) -> (fin-j, i).Aussi haut que l'original était loin de la gauche, et aussi loin de la gauche que du fond de la matrice. –
Si on tourne dans le sens antihoraire, le mappage est un [p] [k] -> un [N-1-k] [p] -> un [N-1-p] [N-1-k] -> a [k] [N-1-p]. Je pense qu'il y a aussi une erreur dans la contrainte pour i. Il devrait être i
Vous pouvez créer un deuxième tableau, puis copier le premier dans le second en lisant row-major dans le premier et en écrivant column-major au second.
Vous copieriez:
1 2 3
4 5 6
7 8 9
et vous lisez la première ligne, puis écrire de nouveau démarrage comme:
3
2
1
voici ma solution: (tourner pi/2 dans le sens horaire)
faire la transposée de la matrice, (comme matrice transposée)
inverser les éléments de chaque rangée
cons int row = 10; cons int col = 10; //transpose for(int r = 0; r < row; r++) { for(int c = r; c < col; c++) { swap(Array[r][c], Array[c][r]); } } //reverse elements on row order for(int r = 0; r < row; r++) { for(int c =0; c < col/2; c++) { swap(Array[r][c], Array[r][col-c-1]) } }
si tourner pi/2 dans le sens antihoraire
transposer le tableau
inverser les éléments sur l'ordre des colonnes
jamais tester le code! toute suggestion serait appréciée!
Chaque élément sera déplacé deux fois (par rapport à 1,25 fois dans la réponse de @Pavel Radzivilovsky), ce qui est moins efficace. Le "upside" est que puisqu'il n'y a pas besoin d'un int int, le besoin en mémoire est réduit de quatre octets ... –
d'accord avec @ Jean-FrançoisCorbett pas aussi efficace que les autres ans. Mais, celui-ci est plus simple à coup sûr. En fait, j'ai également mis en œuvre même algo !! – MalTec
merci cela simplifie grandement la solution –
Un programme C complet qui illustre ma démarche. Essentiellement, c'est l'algo récursif. À chaque récursion, vous faites pivoter la couche externe. Arrêtez lorsque votre matrice est 1x1 ou 0x0.
#include <stdio.h>
int matrix[4][4] = {
{11, 12, 13, 14},
{21, 22, 23, 24},
{31, 32, 33, 34},
{41, 42, 43, 44}
};
void print_matrix(int n)
{
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf(" %d ", matrix[i][j]);
}
printf("\n");
}
}
int *get(int offset, int x, int y)
{
return &matrix[offset + x][offset + y];
}
void transpose(int offset, int n)
{
if (n > 1) {
for (int i = 0; i < n - 1; i++) {
int *val1 = get(offset, 0, i);
int *val2 = get(offset, i, n - 1);
int *val3 = get(offset, n - 1, n - 1 - i);
int *val4 = get(offset, n - 1 - i, 0);
int temp = *val1;
*val1 = *val4;
*val4 = *val3;
*val3 = *val2;
*val2 = temp;
}
transpose(offset + 1, n - 2);
}
}
main(int argc, char *argv[])
{
print_matrix(4);
transpose(0, 4);
print_matrix(4);
return 0;
}
//Java version, fully tested
public class Rotate90degree {
public static void reverseElementsRowWise(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n/2; ++j) {
int temp = matrix[i][n - j - 1];
matrix[i][n - j - 1] = matrix[i][j];
matrix[i][j] = temp;
}
}
}
public static void transpose(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = i + 1; j < n; ++j) {
int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
public static void rotate90(int[][] matrix) {
transpose(matrix);
reverseElementsRowWise(matrix);
}
public static void print(int[][] matrix) {
int n = matrix.length;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
System.out.print(matrix[i][j]);
System.out.print(' ');
}
System.out.println();
}
}
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}};
System.out.println("before");
print(matrix);
rotate90(matrix);
System.out.println("after");
print(matrix);
}
}
- 1. Flex Matrix rotate Image n degrés
- 2. Faire pivoter le texte de 90 degrés avec GDI
- 3. Question d'algorithmes sur une matrice n * n de distances
- 4. Comment puis-je afficher une matrice N x N de nombres aléatoires en Java?
- 5. Disposition de n objets dans un carré n x n
- 6. C# Rotation Bitmap 90 degrés
- 7. j2me - Faire pivoter la matrice de points 2D par incréments de 45 degrés
- 8. Qt - Can QTable peut-il faire pivoter les étiquettes de colonne de 90 degrés?
- 9. Mise en boucle pour faire pivoter une matrice
- 10. Arcball Rotation à 90 degrés
- 11. Faire pivoter une page de 180 degrés dans LaTeX
- 12. Comment faire pivoter un CAGradientLayer de 180 degrés?
- 13. Comment faire pivoter une étiquette en C#?
- 14. Trouver n plus grands nombres dans une matrice clairsemée
- 15. Comment faire pivoter l'image QTVR 360 degrés dans iPhone?
- 16. Comment faire pivoter une vue isométique?
- 17. JPEG sans perte Rotation (90/180/270 degrés) en Java?
- 18. comment faire pivoter le texte?
- 19. Comment faire une icône répétant N fois où N est une variable?
- 20. Comment modéliser une relation n-à-n en Objective-C?
- 21. comment changer \\ n en \ n en perl
- 22. Matlab: comment calculer le « déterminant » d'une matrice N * N dans Matlab
- 23. rotation Quaternion axe x 45 degrés
- 24. Comment remplir une grille N x M efficacement avec Perl?
- 25. Comment calculer n log n = c
- 26. Comment faire pivoter une div avec Raphael.js?
- 27. SQL Server: Comment indexer au mieux une table N-N?
- 28. Comment supprimer une relation auto-référencée n: n dans Doctrine?
- 29. Comment le faire fonctionner dans O (n)?
- 30. n * n table vs (n^2) * 3 table dans mysql
en double de [Comment faites pivoter-vous un tableau à deux dimensions?] (Http://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array) (le code dans ces solutions n'est généralement pas C++, mais les algorithmes sont assez simples pour que la conversion en C++ soit triviale dans la plupart des cas) –
Cela dépend de la façon dont la matrice est stockée dans votre structure de données. Qu'avez-vous essayé jusqu'à présent? –
Dans le sens des aiguilles d'une montre ou dans le sens inverse des aiguilles d'une montre? –