奇数阶魔方阵(动态数组)
奇数阶魔方阵:各行、各列即对角线上元素之和相等(罗伯特法—爬楼梯法)
算法说明:(i、j分别代表行列数,从0开始,n为行数)
1、将 1 填在第一行的中间;
2、向斜向上爬楼梯,即 i–,j++;
3、如果 i<0且j=n, i+=2, j–;
4、如果 i<0 ,则 i=n-1,如果 j=n, j=0;
5、如果该位置已经存储了不为0的数了,则i+=2, j–;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n,**a=NULL,i,j,k;
while(1)
{
scanf("%d",&n);
if(n%2 == 1)
break;
}
a=(int**)malloc(sizeof(int*)*n);
for(i=0; i<n; i++)
{
a[i]=(int*)malloc(sizeof(int)*n);
memset(a[i],0,sizeof(int)*n);
}
i=0;
j=n/2;
a[i][j]=1;
for(k=2; k<=n*n; k++)
{
i--;
j++;
if(i<0 && j==n)
{
i+=2;
j--;
}
if(i<0)
i=n-1;
if(j == n)
j=0;
if(a[i][j])
{
i+=2;
j--;
}
a[i][j]=k;
}
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
printf("%-5d",a[i][j]);
free(a[i]);
printf("\n");
}
free(a);
return 0;
}