编写一个求阶数n(n>2)为奇数的“魔方矩阵”的函数。
魔方矩阵是指这样的方阵:它具有相同的行数n和列数n,并且每行、每列和对角线之和均相等,魔方矩阵中的每个元素不能相同。
要求输入n,输出对应的魔方矩阵。
我设计的幻方阶数的范围是1到100之间的奇数。奇数阶幻方的构造有很多种,这里只提供了一种比较常见简单的构造方法——楼梯法(罗伯法),因其通用性较强,可以设计出更高阶的奇数阶幻方。
#include<stdio.h>
int main()
{
int a[100][100]={0};//定义二维数组
int i,j,n,k;
i=1;
printf("请输入阶数为1~100之间的奇数:\n");
scanf("%d",&n);//输入魔方阵的维度n
j=(n+1)/2;
a[i][j]=1; //确定第一排最中间的数为1
for(k=2;k<=n*n;k++)//已经确定1的位置了,再循环确定2~n*n的位置
{
i=i-1; //挪位,竖排往上挪一位。
j=j+1; //挪位,横排往右挪一位。
if((i<=0)&&(j<=n)) //如果竖排挪到顶,同时横排还没有超过最右
// 竖排就到从最下再继续。
{
i=n;
}
if((i<=0)&&(j>n)) //如果竖排挪到顶,同时横排超过最右
//竖排往下挪两位,横排往左移一位。
{
i=i+2;
j=j-1;
}
if(j>n) //如果只有横排超过最右,横排挪到左边第二行。
{
j=1;
}
if(a[i][j]==0)
{
a[i][j]=k; //如果这个位置还没有赋值,那么赋值为k。
}
else //已经赋值过了。那么竖排往下挪两位,横排往左移一位,再赋值为k
{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++) //循环输出位置。
{
for(j=1;j<=n;j++)
{
printf("%3d ",a[i][j]);
}
printf("\n");//换行
}
}