题目描述
输出魔方阵,所谓魔方阵就是指这样的方阵,它的每一行每一列和对角线之和都相等,例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出由1—n^2之间的自然数构成的魔方阵。
输入要求
输入该方阵的阶数n(n<=15且n为奇数)。
输出要求
输出该n阶魔方阵,两个数字之间用空格间隔
输入样例
3
输出样例
8 1 6 3 5 7 4 9 2
提示
由于魔方阵的填法有很多种,这里给出一种填法:
1.将1放在第一行的最中央。
2.接下来的每个数字都放在前一个数字的右上方。如果右上方被占,则放在前一个数字的下面。
请按照这种方法输出对应的魔方阵!
#include<cstdio>
int hll(int x,int y);//定义行的向上移一行的函数。
int lll(int a,int b);//定义列的向右移一列的函数。
int a[18][18];//定义数组,初始值都为零。
int main()
{
int n,set=0;
scanf("%d",&n);
int h=0,l=(n/2),i,j;// h 为行序号,l 为列序号。
for(i=0;i<n*n;i++){//开始赋值,初始在第零行最中间的一列赋值为 1 .
if(a[h][l]==0){
a[h][l]=i+1;//赋值。
h=hll(n,h);//调用行函数移动行。
l=lll(n,l);//调用列函数移动列。
}
else//由于不符合以上条件需要将行退回,列退回。
{
h=h+2;//要退两行。
l=l-2;//要退两列。
if(h==n){//若出现行大于等于 n 的情况,需要调整赋值。
h=0;
}
else{
if(h==n+1){
h=1;
}
}
if(l==-1){//若出现行小于 0 的情况,需要调整赋值。
l=n-1;
}
else{
if(l==-2){
l=n-2;
}
}
h=hll(n,h);//调用行函数。
l=lll(n,l);//调用列函数。
h=h+1;//行按规律向下移一为。
a[h][l]=i+1;//继续赋值。
h=hll(n,h);//再调用行函数为下一次判断做准备。
l=lll(n,l);//再调用列函数为下一次判断做准备。
}
}
for(i=0;i<n;i++){//以二维数组方式输出。
set=0;//set为了输出规格。
for(j=0;j<n;j++){
if(set==0){
printf("%d",a[i][j]);
set=1;
}
else{
printf(" %d",a[i][j]);
}
}
printf("\n");
}
}
int hll(int x,int y)//行函数。
{
if(y==0){
return x-1;
}
else
{
return y-1;
}
}
int lll(int a,int b)//列函数。
{
if(b==a-1){
return 0;
}
else
{
return b+1;
}
}