Come ruotare una matrice N x N di 90 gradi. Voglio che sia al suo posto?Come ruotare una matrice N x N di 90 gradi?
risposta
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;
}
Nota non ho ancora testato questo , appena compoosed ora sul posto. Si prega di testare prima di fare qualsiasi cosa con esso.
potresti spiegare come sei arrivato con gli indici? –
Spiegando gli indici ... beh, pensa a dove si trova la posizione in (i, j) quando ruota di 90 gradi. Immagina il picutre. (i, j) -> (fine-j, i).Alto quanto l'originale era lontano da sinistra, e il più lontano dalla sinistra com'era dal fondo della matrice. –
Se si ruota in senso antiorario, la mappatura è a [p] [k] -> a [N-1-k] [p] -> a [N-1-p] [N-1-k] -> a [k] [N-1-p]. Penso che ci sia anche un errore nel vincolo per me. Dovrebbe essere
È possibile creare un secondo array e quindi copiare il primo nel secondo leggendo row-major nel primo e scrivendo column-major nel secondo.
Così si sarebbe copiare:
1 2 3
4 5 6
7 8 9
e si dovrebbe leggere la prima fila poi scrivere il backup di partenza come:
3
2
1
ecco la mia soluzione: (ruotare pi/2 in senso orario)
fare la trasposta della matrice, (come matrice trasposta)
invertire gli elementi di ogni riga
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]) } }
se ruotare pi/2 in senso antiorario
trasporre la matrice
invertire gli elementi su ordinazione colonna
mai testare il codice! ogni suggerimento sarebbe apprezzato!
Ogni elemento verrà spostato due volte (rispetto a 1,25 volte nella risposta di @Pavel Radzivilovsky), quindi questo è meno efficiente. Il "lato positivo" è che poiché non c'è bisogno di un 'int temp', il requisito di memoria è ridotto di tutti e quattro i byte ... –
concordato con @ Jean-FrançoisCorbett non efficiente come gli altri ans. Ma, questo è più semplice di sicuro. In realtà, ho anche implementato lo stesso algo !! – MalTec
grazie a ciò semplifica enormemente la soluzione –
Un programma C completo che illustra il mio approccio. Essenzialmente è un algo ricorsivo. Ad ogni ricorsione ruoti lo strato esterno. Interrompi quando la tua matrice è 1x1 o 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. Come posso ruotare una mesh di 90 gradi in ThreeJS?
- 2. Come ruotare TextView 90 gradi e visualizzare
- 3. Come ruotare le etichette dell'asse x di 90 gradi nel piano di livello
- 4. Come ruotare l'immagine x gradi in C#?
- 5. Rotazione di una bitmap a 90 gradi
- 6. immagine iphone catturato dalla fotocamera ruotare -90 gradi automaticamente
- 7. CSS ruotare div 90 gradi a margine sinistro
- 8. Ruota visualizzazione gerarchia 90 gradi
- 9. Come posso ruotare di un array 2d in php di 90 gradi
- 10. Rotazione di un array di pixel 2D di 90 gradi
- 11. Differenza tra matrice (n) e matrice (n) .fill?
- 12. C# ruota la bitmap di 90 gradi
- 13. ordinamento matrice di dimensioni n
- 14. Incolla tutte le possibili diagonali di una matrice n * n o dataframe
- 15. Qual è la differenza tra int * x [n] [m] e int (* x) [n] [m]?
- 16. Perché l'idioma di ricorsione in Haskell "'n + 1' e 'n'" e non "'n' e 'n-1'"?
- 17. Genera percorsi su n * n griglia
- 18. Come ruotare una matrice 2D di numeri interi
- 19. Qual è la prova di (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 20. matrice di sezioni da N all'ultimo elemento
- 21. n ** n ** n euristica in Python
- 22. Rotazione di 90 gradi nei CSS in IE8 e inferiore
- 23. matrice di calore animate/matrice di correlazione marina n.
- 24. Scala: sliding (N, N) vs grouped (N)
- 25. Estrazione prime n colonne di una matrice NumPy
- 26. Come risolvere: T (n) = T (n - 1) + n
- 27. operazioni di matrice con matrice n-dimensionale utilizzando LINQ (C#)
- 28. Trova il rettangolo più grande contenente solo zeri in una matrice binaria N × N
- 29. C#: divisione di una matrice in n parti
- 30. Converti da matrice n x m a matrice lunga in R
duplicato di [Come si fa ruotare una matrice bidimensionale?] (Http://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array) (il codice in queste soluzioni non è per lo più C++, ma gli algoritmi sono abbastanza semplici che la conversione in C++ dovrebbe essere banale nella maggior parte dei casi) –
Dipende dal modo in cui la matrice è memorizzata nella struttura dati. Cosa hai provato fino ad ora? –
In senso orario o antiorario? –