魔方阵,古代又称
“
纵横图
”
,是指组成元素为自然数
1
、
2…n
的平方的
n×n
的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各
n
个元素之和都相等。
如 3×3 的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
(1) 将 1 放在第一行中间一列;
(2) 从 2 开始直到 n×n 止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减 1 ,列数加 1 (例如上面的三阶魔方阵, 5 在 4 的上一行后一列);
(3) 如果上一个数的行数为 1 ,则下一个数的行数为 n( 指最下一行 ); 例如 1 在第一行,则 2 应放在最下一行,列数同样加 1 ;
(4) 当上一个数的列数为 n 时,下一个数的列数应为 1 ,行数减去 1 。例如 2 在第 3 行最后一列,则 3 应放在第二行第一列;
此方法只能输入奇数阶魔方阵,偶数阶继续研究
如 3×3 的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
(1) 将 1 放在第一行中间一列;
(2) 从 2 开始直到 n×n 止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减 1 ,列数加 1 (例如上面的三阶魔方阵, 5 在 4 的上一行后一列);
(3) 如果上一个数的行数为 1 ,则下一个数的行数为 n( 指最下一行 ); 例如 1 在第一行,则 2 应放在最下一行,列数同样加 1 ;
(4) 当上一个数的列数为 n 时,下一个数的列数应为 1 ,行数减去 1 。例如 2 在第 3 行最后一列,则 3 应放在第二行第一列;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int arr[n][n];
//将数组中所有元素都赋值为0
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
arr[i][j]=0;
}
}
//赋值
int i=0,j=n/2,k=1;
arr[i][j]=k;
for(k=2;k<=n*n;k++){
int x=i,y=j; //记录上一次输入值k的位置
i=i-1;
j=j+1;
if(i<0){
i=n-1;
}
if(j==n){
j=j-n;
}
if(arr[i][j]!=0){ //arr[i][j]!=0代表该位置已经被赋值
i=x+1;
j=y;
}
arr[i][j]=k;
}
//输出
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d",arr[i][j]);
if(j<n-1) printf("\t");
else printf("\n");
}
}
return 0;
}
此方法只能输入奇数阶魔方阵,偶数阶继续研究