数阵,每行,每列,对角线之和均相等
#include <stdio.h>
# define Max 20
void main()
{
void create(int n);
int n;
printf("input number:");
scanf("%d",&n);
create(n);
}
void create(int n)
{
int a[Max][Max],k,l;
for(k=0;k<n;k++)//初始化0,置标记
{ for(l=0;l<n;l++)
a[k][l]=0;
}
a[0][n/2]=1;//初始化1
int prei=0,prej=n/2;//记录前驱下标
int count=1;
int indexi,indexj;//当前下标
while(count<n*n)//魔方数字个数
{
indexi=(prei-1+n)%n;
indexj=(prej+1)%n;
if(a[indexi][indexj]==0)
{
a[indexi][indexj]=++count;
prei=indexi;//前驱小标移动
prej=indexj;
}
else//回退,利用前驱找空位置
{
while(a[(prei+1)%n][prej]!=0)//上一个数的下面
{
prei=(prei+1)%n;
prej=(prej-1+n)%n;
}
prei=(prei+1)%n;//行+1,列不变
a[prei][prej]=++count;
}
}
//输出
for(k=0;k<n;k++)
{ for(l=0;l<n;l++)
printf("%4d ",a[k][l]);
printf("\n");
}
}
input number: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
Press any key to continue