奇数阶魔方的输出可采用右上方填补法:
如上图:将二维数组魔方阵全部初始化为0,令第一行中间位置的元素(即a[0][n/2])为1;将1至n*n的数从1开始以次填在上一个数的右上方(例如1的下一个数2按规则要放在1的右上方,但1已经是第一行没有上一行,所以变成最后一行,列数有下一列的,所以2应该放在最后一行下一列),规制如上表。
例如输出一个5阶魔方阵,按照此方法填空后为
按照上述规则大家可以自己推一下这张表。
代码:
#include<stdio.h>//需要引入的文件
//如解答错误,注意检查错误信息提示,对比预期输出和实际输出之间的差异
int main() {
int n;
scanf("%d",&n);
int a[n][n];
for(int x=0;x<n;x++)
{
for(int y=0;y<n;y++)
{
a[x][y]=0; //将二维数组初始化为0.
}
}
int i,j;
i=0;
j=n/2;
a[i][j]=1; //将第一行中间一列初始化为1。
int p,q;
int m;
for(m=2;m<=n*n;m++)
{
p=i;q=j;
if(i-1 < 0) //如果没有上一行,就为最后一行。因为数组下标从0开始,所以最后一行为n-1.
i=n-1;
else
i=i-1;
if(j+1 > n-1) //如果没有下一列,就为第一列。
j=0;
else
j=j+1;
if(a[i][j] != 0)//不等于0表示此处已经有元素了,那就放在上一个数的下一行同一列。
{
i=p+1;
j=q;
}
a[i][j]=m;
}
for(int i=0;i<n;i++) //输出
{
for(int j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}