Mercurial > louis > peeves
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; }