Solución a la Tarea 6: Matrices giradas

Esta tarea tenía varias soluciones simples. Abajo muestro una de ellas donde la función gira hace la transformación esperada. Un simple cálculo muestra que para girar una matriz basta colocar la entrada A[i][j] en la entrada B[j][n-i-1] para toda 0 <= i, j < n. Una solución más ingeniosa consiste en calcular la transpuesta de la matriz A y luego imprimirla de derecha a izquierda. ¿Porqué funciona esto último?

#include <stdio.h>
 
#define M 20
 
void lee(int m, int n, int a[M][M])
{
  int i, j;
 
  for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
      scanf("%d", &a[i][j]);
}
 
void escribe(int m, int n, int a[M][M])
{
  int i, j;
 
  for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++)
      printf("%d ", a[i][j]);
    printf("\n");
  }
}
 
void gira(int n, int a[M][M], int b[M][M])
{
  int i, j;
 
  for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
      b[j][n-i-1] = a[i][j];
}
 
int main(void)
{
  int n, x[M][M], y[M][M];
 
  scanf("%d", &n);
  lee(n, n, x);
  gira(n, x, y);
  escribe(n, n, y);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

1
9
2
1 2
3 4
3
3 1 4
1 5 9
2 6 5
4
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6
5
3 1 4 1 5
9 2 6 5 7
3 1 4 1 5
9 2 6 5 7
3 1 4 1 5
9
3 1
4 2
2 1 3
6 5 1
5 9 4
3 9 5 1
4 0 6 2
5 1 7 3
6 2 8 4
3 9 3 9 3
1 2 1 2 1
4 6 4 6 4
1 5 1 5 1
5 7 5 7 5
6
1 2 3 4 1 2
5 6 7 8 3 4
9 0 1 2 5 6
3 4 5 6 7 8
9 0 1 2 3 4
5 6 7 8 9 0
7
0 1 2 3 4 5 6
3 3 1 4 1 5 7
2 9 2 6 5 7 8
1 3 1 4 1 5 9
0 9 2 6 5 7 0
9 3 1 4 1 5 1
8 7 6 5 4 3 2
8
1 2 3 4 1 2 1 4
5 6 7 8 3 4 2 5
9 0 1 2 5 6 3 6
3 4 5 6 7 8 4 7
9 0 1 2 3 4 5 8
5 6 7 8 9 0 6 9
7 8 9 0 1 2 3 0
1 2 3 4 5 6 7 8
9
3 2 6 7 9 3 5 4 3
6 2 7 8 3 4 5 6 1
9 8 6 4 0 6 4 2 3
9 6 4 8 1 0 9 6 7
0 1 5 3 7 8 6 5 9
0 1 8 5 9 5 3 4 5
1 5 4 7 8 9 8 3 7
1 2 3 4 5 6 7 8 9
9 1 7 4 2 8 7 4 9
10
1 1 2 3 4 1 2 1 4 6
2 5 6 7 8 3 4 2 5 5
3 9 0 1 2 5 6 3 6 4
4 3 4 5 6 7 8 4 7 3
5 9 0 1 2 3 4 5 8 2
6 5 6 7 8 9 0 6 9 1
7 7 8 9 0 1 2 3 0 0
8 1 2 3 4 5 6 7 8 1
9 0 1 2 3 4 5 6 7 2
8 9 0 9 8 7 6 5 4 3
5 9 3 9 5 1
6 0 4 0 6 2
7 1 5 1 7 3
8 2 6 2 8 4
9 3 7 5 3 1
0 4 8 6 4 2
8 9 0 1 2 3 0
7 3 9 3 9 3 1
6 1 2 1 2 1 2
5 4 6 4 6 4 3
4 1 5 1 5 1 4
3 5 7 5 7 5 5
2 1 0 9 8 7 6
1 7 5 9 3 9 5 1
2 8 6 0 4 0 6 2
3 9 7 1 5 1 7 3
4 0 8 2 6 2 8 4
5 1 9 3 7 5 3 1
6 2 0 4 8 6 4 2
7 3 6 5 4 3 2 1
8 0 9 8 7 6 5 4
9 1 1 0 0 9 9 6 3
1 2 5 1 1 6 8 2 2
7 3 4 8 5 4 6 7 6
4 4 7 5 3 8 4 8 7
2 5 8 9 7 1 0 3 9
8 6 9 5 8 0 6 4 3
7 7 8 3 6 9 4 5 5
4 8 3 4 5 6 2 6 4
9 9 7 5 9 7 3 1 3
8 9 8 7 6 5 4 3 2 1
9 0 1 7 5 9 3 9 5 1
0 1 2 8 6 0 4 0 6 2
9 2 3 9 7 1 5 1 7 3
8 3 4 0 8 2 6 2 8 4
7 4 5 1 9 3 7 5 3 1
6 5 6 2 0 4 8 6 4 2
5 6 7 3 6 5 4 3 2 1
4 7 8 0 9 8 7 6 5 4
3 2 1 0 1 2 3 4 5 6

Para probar su tarea en UNIX, escriban la instrucción gcc giradaNN.c -o girada para compilar su programa, y la instrucción ./pescon para correrlo. Algunos errores comúnes fueron: (a) No considerar alguna de las columnas o renglones de las orillas. (b) Girar en la dirección equivocada. (c) No poner espacios para separar las entradas de la matriz de salida.