¿Cuál es el algoritmo para rotar una matriz bidimensional?

Refinando la respuesta de Neeraj Sinha

La matriz NXN se puede considerar como una colección de anillos cuadrados concéntricos.


El número de tales anillos cuadrados = piso (N / 2)
En el diagrama del caso anterior, cuenta de anillos = 2, negro exterior y amarillo interior

Este conteo de anillos cuadrados le dará el tamaño para el bucle externo

Para cada anillo, haz
Comience desde el elemento [número_ ring] [número_ ring]
Haz lo siguiente

  1. Haz el paso 1
  2. Haz el paso 2
  3. Haz el paso 3
  4. Haz el paso 4

Fin del bucle for para anillos

Para el paso 1 anterior, vaya horizontal, en row_number = ring_number
Para el paso 2 anterior, vaya vertical, en column_number = (N-1) -ring_number
Para el paso 3 anterior, vaya horizontal, en row_number = (N-1) -ring_number
Para el paso 4 anterior, vaya vertical, en column_number = ring_number

Para cada uno de los pasos anteriores, el bucle interno será N- (ring_number * 2) veces, porque con cada iteración del anillo, pierde dos filas o dos columnas

Espero que esto te ayude a comenzar

Bueno, gracias por el A2A Siva Chaitanya.
Tengo un algoritmo directo que puede generar el resultado deseado en el lugar (sin requerir espacio adicional, aparte de la matriz 2-D).
El problema se reduce a atravesar la matriz 2-D de forma circular (o de forma circular ).

Considere la primera entrada:
1 2 3
4 5 6
7 8 9

Supongamos que la matriz es: a [3] [3]
Comience desde un [0] [0] y atraviese hasta un [0] [2] (inclusive). Después de llegar al final de la primera línea, atraviese hacia abajo, es decir, desde un [0] [2] a un [2] [2] (inclusive). Ahora ve a la izquierda! y luego arriba! Espero que hayas entendido lo que quise decir con moda circular.

Por lo tanto, mientras recorre la matriz de la manera mencionada anteriormente, asegúrese de intercambiar los elementos para lograr el resultado deseado. Se puede hacer de la siguiente manera.
(No estoy presentando el código completo. Solo una función)

int ** transform_matrix (int a [4] [4]) {
int ** array = a;
int inicio = 0, final = 3;
while (inicio int prev = a [inicio] [inicio];
for (int i = start; i int temp = a [inicio] [i + 1];
a [inicio] [i + 1] = anterior;
prev = temp;
}
for (int i = start; i int temp = a [i + 1] [fin];
a [i + 1] [fin] = anterior;
prev = temp;
}
for (int i = end; i> start; i -) {
int temp = a [fin] [i-1];
a [final] [i-1] = anterior;
prev = temp;
}
for (int i = end; i> start; i -) {
int temp = a [i-1] [inicio];
a [i-1] [inicio] = anterior;
prev = temp;
}
inicio ++; final–;
}
matriz de retorno;
}

Lo he implementado para su segunda entrada (matriz 4X4). También podemos generalizarlo para una matriz cuadrada de tamaño: NXN

Cuidado : puede haber algunos errores …! 😉

PD: Por favor verifique si hay casos de esquina, ¡y sí! Siva Chaitanya, estoy esperando que ratifiques mi código tonto. Espero que retires tus críticas 😛

Me parece simple, aunque no tengo el código fuente listo, avíseme si tiene alguna dificultad para implementar esto:

Considere la matriz NxN como cuadrados anidados, lo he ilustrado en la imagen (marque el garabato más a la izquierda):


Ahora algo pasa de la siguiente manera:

[código]
max = N-1; min = 0;

  1. Siga incrementando la columna # hasta alcanzar el máximo.
  2. Una vez que llegue al máximo, siga incrementando la fila #.
  3. Una vez que llegue al máximo, siga disminuyendo la columna #.
  4. Una vez que llegue al mínimo, siga disminuyendo la fila #.

/ * Has rotado con éxito el cuadrado más externo. Es hora de repetir los mismos cuatro pasos anteriores para los internos. * /

min ++; max–;
[/código]

Imprimir una matriz dada en forma de espiral – GeeksforGeeks

La misma idea se puede usar aquí.