魔方阵
所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵:
8 1 6
3 5 7
4 9 2魔方阵的规律如下: 从1~N*N的 各个数依次如下规则存放:
(1) 1在第一行中间一列;
(2) 每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列);
(3) 如果上一个数在第一行,则下一个数在最后一行,列数加一;
(4) 如果上一个数在最后一列,则下一个数在第一列,行数减一;
(5) 如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。
Input:
输入包含多组数据,每组为一个小于100的正奇数。
Output:
对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。
Sample Input:
3
Sample Output:
8 1 6
3 5 7
4 9 2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF) {
int a[n][n];
memset(a,0,sizeof(a));//初始化数组
int i=0,j=n/2;
a[i][j]=1;//第一行中间元素赋值为1
for(int k=2;k<=n*n;k++) {
if(a[(i+n-1)%n][(j+1)%n]==0) {
//它的上一行,下一列还未被赋值(仍未初值0时)就把他赋值为k
i=(i+n-1)%n;
j=(j+1)%n;
a[i][j]=k;
}else if(a[(i+n-1)%n][(j+1)%n]!=0||(i==0&&j==n-1)) {
//如果位置已经有数,
//或上一个数在第一行第N列,
//则下一个数,放在上一个数的正下方。
i=(i+1)%n;
a[i][j]=k;
}
}
for(i=0;i<n;i++){
//打印输出二维矩阵
for(j=0;j<n-1;j++)
{
printf("%d ",a[i][j]);
}
printf("%d\n",a[i][j]);
}
printf("\n");
}
return 0;
}