魔幻矩阵
编程实现9*9以内任意奇数阶方阵的魔幻矩阵。
所谓奇数魔幻矩阵就是n*n的矩阵(n为奇数)的n*n个格子中放入数1到n*n,使得每行、每列、主对角线、付对角线上元素的和都相等。算法生成如下::
1 ,第一个数字在第一行的中间位置
2,以后每一个数放在前一个数的右上方,,如果向上超出了界限,在矩阵的最后一行插入,列不变;,如果右侧超出了界限,在矩阵的最左边插入,行不变。
3.如果插入数的位置已经有数,则在前一个数的下方插入。.
5*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
输入提示:"input Magic matrix n:"
输入格式:"%d"
输出格式:"%4d"
程序运行示例:
input Magic matrix n:4
9 15 1 7
14 4 6 8
3 5 11 13
0 10 12 2
#include<stdio.h>
int main()
{
int a[9][9]={0},i,j=0,n;
printf("input Magic matrix n:");
scanf("%d",&n);
int k;
if(n%2!=0) k=(n-1)/2;
else k=n/2;
for(i=1;i<=n*n;i++)//n*n个数,从1开始依次填入矩阵
{
if(j<0) j=n-1;//j代表行,当j<0时,j为最后一行
if(k>n-1) k=0;//k代表列,当k>n-1时,k变为第一列
if(a[j][k]==0)//判断该位置是否已经填入了数字,若没填,则填入
{
a[j][k]=i;
}
else//若已经填入了数字,则填到前一个数的下方
{
j=j+1+1;//j+1为前一个数的行,j+1+1为前一个数的下方
k=k-1;//k-1为前一个数的列
if(j>n-1) j=j-n;//当j=n或者n+1时,实际上为第一行和第二行
if(k<0) k=n-1;//当k=-1时,实际上k=n-1即最后一列
a[j][k]=i;
}
j=j-1;
k=k+1;
}
for(i=0;i<n;i++)//打印该魔幻矩阵
{
for(j=0;j<n;j++)
{
printf("%4d",a[i][j]);
}
printf("\n");
}
return 0;
}