view arrays/rotate_matrix_90/solution.c @ 0:20fea762903e

Import some exercises and solutions
author Louis Opter <kalessin@kalessin.fr>
date Sat, 29 Jun 2013 19:30:31 -0700
parents
children
line wrap: on
line source

#define _BSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int even_array[4][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12},
    {13, 14, 15, 16}
};

int odd_array[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

int
abs(int v)
{
    return v ? v >= 0 : v * -1;
}

void
swap(int *a, int *b)
{
    int save = *b;
    *b = *a;
    *a = save;
}

void
print_array(int array[][4], int size)
{
    printf("Array %1$d×%1$d:\n", size);
    for (int i = 0; i != size; i++) {
        for (int j = 0; j != size; j++) 
            printf(" %2d", array[i][j]);
        printf("\n");
    }
}

void
rotate_90(int array[][4], int size)
{
    int i;
    int j;
    int next_i;
    int next_j;
    int value;

    for (int layers = 0; layers != size / 2; layers++) {
        for (int rounds = layers; rounds != size - 1 - layers; rounds++) {
            i = layers;
            j = rounds;
            value = array[i][j];
            do {
                next_j = abs(size - 1 - i);
                next_i = j;
                printf("%d (%d, %d) → (%d, %d)\n", value, i, j, next_i, next_j);
                usleep(250000);
                swap(&value, &array[next_i][next_j]);
                print_array(array, size);
                i = next_i;
                j = next_j;
            } while (next_i != layers || next_j != rounds);
        }
    }
}

int
main(void)
{
    // http://c-faq.com/aryptr/pass2dary.html
#if 0
    print_array(odd_array, 3);
    printf("rotating…\n");
    rotate_90(odd_array, 3);
    printf("rotated…\n");
    print_array(odd_array, 3);

    printf("***\n");
#endif
  
    print_array(even_array, 4);
    printf("rotating…\n");
    rotate_90(even_array, 4);
    printf("rotated…\n");
    print_array(even_array, 4);

    return EXIT_SUCCESS;
}