魔方陣
奇数が入力されたときに,魔方陣を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; }