前言
这道题目是输出魔方阵,在这之前我并不清楚魔方阵是什么东西,查阅了一些资料,大概清楚了它的概念。本文适用于奇数矩阵。
正文
概念
由 NxN个数字所组成的n阶方阵,若具有各对角线、各横列与纵行的数字和都相等的性质,则称为魔方阵。这个相等的和称为魔术数字。若填入的数字是从1到NxN,称此种魔方阵为n阶正规魔方阵。
如下所示为一个5阶魔方阵。
步骤
假定当前数的下标为(i,j),先确定1所在的位置,把1放到顶行的正中间,接着把后面的数继续按顺序放置在魔方阵中,魔方阵的构建方法要遵循以下顺序
- 当前数是n的倍数:则将下一个数直接放置在当前位置的正下方
- 当前数在第0行:则将下一个数放置在最后一行的下一列上
- 当前数在最后一列:即n-1列:则将下一个数放置在上一行的第一列上
- 除以上情况外:则下一个数放置的位置为当前位置的右上方
代码(二维数组)
#include <stdio.h>
#include <stdlib.h>
int MagicSquare(int n);
int main()
{
int n;
scanf("%d",&n);
MagicSquare( n);
return 0;
}
int MagicSquare(int n){
int max,num,i,j;
int **mtr;
/*为魔方阵分配内存*/
mtr=(int **)malloc(sizeof(int*)*n);
for(i=0;i<n;i++){
mtr[i]=(int*)malloc(sizeof(int)*n);
}
max=n*n;
i=0;
j=n/2;
mtr[i][j]=1;/*自然数1所在列*/
for(num=1;num<max;num++){
if(num%n==0){/*当前数是n的倍数*/
i=i+1;
}
else if(i==0){/*当前数在第0行*/
i=n-1;
j++;
}
else if(j==n-1){/*当前数在最后一列,即n-1列*/
i=i-1;
j=0;
}
else{
i=i-1;
j=j+1;
}
mtr[i][j]=num+1;
}
printf("打印魔方阵\n");5;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%3d ",mtr[i][j]);
}
printf("\n");
}
printf("\n");
free(mtr);
return 0;
}
注意:需要注意二维数组(指向指针的指针)malloc的过程,两次malloc
代码二(一维数组)
#include <stdio.h>
#include <stdlib.h>
int MagicSquare(int n);
int main()
{
int n;
scanf("%d",&n);
MagicSquare( n);
return 0;
}
int MagicSquare(int n){
int max,no,num,i,j;
int *mtr;
max=n*n;
mtr=(int*)malloc(sizeof(int)*max);
mtr[n/2]=1;
i=0;
j=n/2;
for(num=1;num<max;num++){
if(num%n==0){/*当前数是n的倍数*/
i=i+1;
}
else if(i==0){/*当前数在第0行*/
i=n-1;
j++;
}
else if(j==n-1){/*当前数在最后一列,即n-1列*/
i=i-1;
j=0;
}
else{
i=i-1;
j=j+1;
}
no=i*n+j;
mtr[no]=num+1;
}
printf("打印魔方阵\n");
no=0;
for(i=0;i<n;i++){
printf("\n");
for(j=0;j<n;j++){
printf("%3d ",mtr[no]);
no++;
}
}
printf("\n");
free(mtr);
return 0;
}