#include <stdio.h>
int main(int argc, char *argv[])
{
int a[20][20]={0};
int i,j,n,x,y,X,Y;
scanf("%d",&n);
a[1][n/2+1] = 1;
x=1,y=n/2+1;
for (i=2;i<=n*n;i++){
X = x-1,Y = y+1;
if(X<=0) X=n;
if(Y>n) Y=1;
if(a[X][Y]==0){
a[X][Y]=i;
x = X;y = Y;
}
else{
a[x+1][y]=i;
x=x+1;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}
"魔方阵"是指一个AN*N矩阵(在本题中N仅为奇数,且N>1),以自然数1,2, 。。。 N2为元素进行填充,每个位置上分别放置一个元素,使每行、每列以及主、副对角线上的元素之和都相等。
如3*3魔方阵,图在每行、每列、主对角线、副对角线上元素之和均为15:
8 1 6
3 5 7
4 9 2
奇数阶魔方阵的生成算法如下,初始矩阵A为空,从1开始依据下面的规则依次放置各个自然数(注意在下面的叙述中各元素行、列下标均以1-N计数):
1. 将1放在第一行正中的位置,即A[1, (j+1)/2];
2. 设最后放置的元素是A[i, j],则将下一个元素放在最后一个插入位置的右上方,即A[i-1, j+1]。但如果该位置已超出方阵的上边界(即如果i<0),则新位置取该列的最下一个位置,即A[N, j+1];如果该位置已超出方阵的右边界,取新位置取该行的最左一个位置,即A[i-1, 1]。
3. 若最近一个插入元素为N的整倍数,则新位置取最后插入元素下面的位置,即A[i+1, j]。
输入一个奇数N,打印对应的N阶魔方阵。
【输入形式】
控制台输入一奇数N。
【输出形式】
输出一个N*N的魔方阵,其中每个数字占4位字符的宽度,向右对齐。
【样例输入】
5
【样例输出】
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
【样例说明】
输入奇数5,输出5阶魔方阵。
#include <stdio.h>
int main(int argc, char *argv[])
{
int a[20][20]={0};
int i,j,n,x,y,X,Y;
scanf("%d",&n);
a[0][n/2] = 1;
x=0,y=n/2;
for (i=2;i<=n*n;i++){
X = x-1,Y = y+1;
if(X<0) X=n-1;
if(Y>n-1) Y=0;
if(a[X][Y]==0){
a[X][Y]=i;
x = X;y = Y;
}
else{
a[x+1][y]=i;
x=x+1;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}