魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
⑴将1放在第一行中间一列;
⑵从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
⑶如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
⑷当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
⑸如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
以上来自百度百科:
点击打开链接
有了以上的规律,我们就可以很好的写出程序来:
# include <stdio.h>
int main ()
{
int n, i, j, k, m;
int hang, lie;
int a[50][50];
scanf("%d", &m);
while(m--)
{
scanf("%d", &n); //输入一个奇数
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++) //用到的位置赋值为0
a[i][j]=0;
for(i = 0; i <= n + 1; i++) //不需要的位置赋值为-1
a[i][n + 1] = -1;
for (j = 0; j <= n + 1; j++)
a[0][j] = -1;
a[1][n / 2 + 1] = 1; //初始化1
hang = 1; lie = n / 2 + 1; //记录行和列的位置
for(k = 2;k <= n * n; k++) //1已经赋值好了,从2开始
{
if(hang == 1 && lie != n) //行等于1, 列不为n的情况
{
hang = n; lie = lie + 1;
a[hang][lie] = k;
continue; //继续循环
}
if(lie == n && hang != 1) //列为n,行不为1的情况
{
hang = hang - 1; lie = 1;
a[hang][lie] = k;
continue; //继续循环
}
hang = hang - 1; lie = lie + 1;//不是以上的特殊情况
if (a[hang][lie] != 0) //该位置不为0
{
hang = hang + 1 + 1;
lie = lie - 1;
a[hang][lie] = k;
}
else //该位置为0
a[hang][lie] = k;
}
for (i = 1;i <= n; i++)
{
for (j = 1;j <= n; j++)
printf("%4.d", a[i][j]);
printf("\n");
}
}
return 0;
}
样例结果: