Cómo rotar una matriz N x N en 90 grados. Quiero que esté en el lugar?¿Cómo rotar una matriz N x N en 90 grados?
Respuesta
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 no he probado esto , solo compuesto ahora en el acto. Por favor, prueba antes de hacer algo con él.
¿podría explicarme cómo surgieron los índices? –
Explicando los índices ... bueno, piense dónde va la ubicación en (i, j) al girar 90 grados. Solo imagina la foto. (i, j) -> (end-j, i).Tan alto como el original estaba lejos de la izquierda, y tan lejos de la izquierda como del fondo de la matriz. –
Si se gira en sentido antihorario, la asignación es [p] [k] -> a [N-1-k] [p] -> a [N-1-p] [N-1-k] -> a [k] [N-1-p]. Creo que también hay un error en la restricción para i. Debería ser i
Puede crear una segunda matriz y luego copiar la primera en la segunda leyendo row-major en la primera y escribiendo column-major en la segunda.
por lo que sería copiar:
1 2 3
4 5 6
7 8 9
y puedan leer la primera fila y luego escribir una copia de seguridad de partida como:
3
2
1
aquí es mi solución: (girar pi/2 hacia la derecha)
hacer la transpuesta de la matriz, (como transposición de matriz)
revertir los elementos de cada fila
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 gira pi/2 en sentido antihorario
transponer la matriz
revertir los elementos en orden de columnas
no probar el código! ¡cualquier sugerencia sería apreciada!
Cada elemento se moverá dos veces (en comparación con 1,25 veces en la respuesta de @Pavel Radzivilovsky), por lo que es menos eficiente. El "aspecto positivo" es que, dado que no es necesario un 'int temp', el requisito de memoria se reduce en los cuatro bytes ... –
de acuerdo con @ Jean-FrançoisCorbett no es tan eficiente como los otros ans. Pero, este es más simple seguro. En realidad, también implementé el mismo algo !! – MalTec
gracias esto simplifica en gran medida la solución –
Un completo programa C que ilustra mi enfoque. Esencialmente es algo recurrente. En cada recursión, se rota la capa externa. Deténgase cuando su matriz sea 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. Rotar una matriz bidimensional en 90 grados
- 2. Cómo rotar TextView 90 grados y mostrar
- 3. Rotar un mapa de bits 90 grados
- 4. Cómo rotar una imagen 90 grados en iOS?
- 5. Cómo rotar las etiquetas del eje x 90 grados en el diagrama de nivel
- 6. ¿Cómo rotar una matriz 90 grados sin usar ningún espacio extra?
- 7. ¿Girando un CALayer 90 grados?
- 8. Rotar matriz 2D en 45 grados
- 9. ¿Cómo rotar la imagen mediante programación en 90 grados en iPhone?
- 10. Buscar elementos N superiores en una matriz
- 11. Cómo rotar una matriz 2D de enteros
- 12. Lossless JPEG ¿Girar (90/180/270 grados) en Java?
- 13. ¿Cómo ordenar una matriz m x n que tiene todas sus m filas ordenadas y n columnas ordenadas?
- 14. ¿Es log (n!) = Θ (n · log (n))?
- 15. numpy: sintaxis/idioma para convertir (n,) matriz a una (n, 1) matriz?
- 16. ¿Cómo resolver: T (n) = T (n - 1) + n
- 17. ¿Rotar una parcela en MATLAB?
- 18. Cómo calcular n log n = c
- 19. Divide matriz en fragmentos de N longitud
- 20. ¿Cuál es la prueba de (N-1) + (N-2) + (N-3) + ... + 1 = N * (N-1)/2
- 21. Una matriz de longitud N puede contener valores 1,2,3 ... N^2. ¿Es posible ordenar el tiempo O (n)?
- 22. Writeablebitmap.SaveJpeg está girando mi imagen -90 grados
- 23. ¿Cuál es la 'manera de Ruby' para iterar en una matriz, desde la matriz [n] hasta la matriz [n - 1]?
- 24. Guardar una relación con dos entidades una asociación N-N
- 25. ¿La manera más fácil de girar 90 grados una imagen usando OpenCV?
- 26. Reemplazando "\ r \ n" por "\ n"
- 27. ¿Qué hace -n en si [-n "$ {TEMP_FILE_LIST}"]?
- 28. ConfigurationManager.AppSettings convierte "\ n" en "\\ n" ¿por qué?
- 29. Big-O complejidad de c^n + n * (log n)^2 + (10 * n)^c
- 30. ¿Podemos calcular esto en menos de O (n * n) ... (nlogn o n)
duplicados de [¿Cómo girar una matriz de dos dimensiones?] (Http://stackoverflow.com/questions/42519/how-do-you-rotate-a-two-dimensional-array) (el código en esas soluciones generalmente no es C++, pero los algoritmos son lo suficientemente simples como para que la conversión a C++ sea trivial en la mayoría de los casos) –
Eso depende de cómo se almacena la matriz en su estructura de datos. ¿Qué has intentado hasta ahora? –
En sentido horario o antihorario? –