魔方陣

奇数が入力されたときに,魔方陣を1つ生成します.
ヒンズーの連続方式(Siamese methodとも言うらしい)を用いました.

#include <stdio.h>
#include <stdlib.h>

void makeMagicSqu(int ***matrix, int n) {
    int x = n / 2, y = 0;
    int nextx, nexty;
    int cnt = 1;

    while( cnt <= n * n ) {
        if( (*matrix)[x][y] == 0 ) {
            (*matrix)[x][y] = cnt;
            cnt++;
        }
        nextx = (x + 1) % n;
        nexty = (n - 1) - (n - y) % n;
        if( (*matrix)[nextx][nexty] != 0 ) {
            y++;
        } else {
            x = nextx;
            y = nexty;
        }
    }

    return;
}

void print(int **matrix, int n) {
    int i, j;

    for( j = 0; j < n; j++ ) {
        for( i = 0; i < n; i++ ) {
            printf("%2d ", matrix[i][j]);
        }
        puts("");
    }

    return;
}

void allocSquMatrix(int ***matrix, int n) {
    int i, j;

    *matrix = malloc(sizeof(int *) * n);
    for( i = 0; i < n; i++ ) {
        (*matrix)[i] = calloc(n, sizeof(int));
    }

    return;
}

void freeSquMatrix(int ***matrix, int n) {
    int i, j;

    for( i = 0; i < n; i++ ) {
        free((*matrix)[i]);
    }
    free(*matrix);

    return;
}

int main(void) {
    int **matrix;
    int n;
    int i, j;

    printf(">");
    scanf("%d", &n);

    allocSquMatrix(&matrix, n);

    makeMagicSqu(&matrix, n);
    print(matrix, n);

    freeSquMatrix(&matrix, n);

    return 0;
}