Coxeter提出生成奇数阶魔方的方法:
开始时,在魔方第一行的中间一格放1,然后重复以下步骤:
移动到左上一格,把当前的数加1放在这个位置上。如果移动时超出魔方范围,则想象与当前状态完全相同的另一个魔方,(对齐)紧靠在超出的那条边界线上,因而可以继续。如果移动的格子已经放了数字,则从这个位置向正下方移动一格。直到把所有格子填满。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 15
void main()
{
int square[MAX_SIZE][MAX_SIZE];
int i,j,row,col;
int count;
int size;
printf("Enter the size of the square:");
scanf("%d",&size);
if(size<1||size>MAX_SIZE+1){
fprintf(stderr,"Error!size is out of range!");
exit(EXIT_FAILURE);
}
if(!(size%2)){
fprintf(stderr,"Error!Size is even");
exit(EXIT_FAILURE);
}
for(int i=0;i<size;i++){
for(int j=0;j<size;j++){
square[i][j]=0;
}
}
square[0][(size-1)/2]=1;
i=0;j=(size-1)/2;
for(count=2;count<size*size;count++){
row=(i-1<0)?(size-1):(i-1);
col=(j-1<0)?(size-1):(j-1);
if(square[row][col]){
i=(++i)%size;
}else{
i=row;
j=(j-1<0)?(size-1):--j;
}
square[i][j]=count;
}
printf("Magic Square of size %d:\n\n",size);
for(i=0;i<size;i++){
for(j=0;j<size;j++){
printf("%5d",square[i][j]);
}
printf("\n");
}
}
运行结果截图: