输出魔方阵。所谓魔方阵是指这样的方阵,它的每一行,每一列和对角线之和均相等。如下就是三阶魔方阵(即n=9):
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>
#include<stdlib.h>
#define N 16
main()
{
int a[N][N]={0},i,j,n,b,g;//a[][]用来存放数据
printf("enter n(n=1 to 15):");//n阶魔方
scanf("%d",&n);
if(n>=1&&n<=15&&n%2!=0)//a[][]对0行0列不用来存放数据,只用1~15行,魔方的阶数为奇数
{
i=1;
j=(n+1)/2;
a[1][(n+1)/2]=1;//先确定1的位置,在第一行中间一列
g=1;
for(b=2;b<=n*n;b++)//b=1,2,3……n
{
if(b==1+n*g)//找规律发现b=1+n*g(g=1,2……) 时,b要排在上一个数的下面
{
a[i+1][j]=b;
i=i+1;
g++;
//b++;
continue;
}
if(2<=i&&i<=n)//魔方的形成规则,详细参见题目
i=i-1;
else{
if(i=1)
i=n;
}
if(1<=j&&j<=n-1)
j=j+1;
else{
if(j=n)
j=1 ;
}
a[i][j]=b;
}
}
for(i=1;i<=n;i++)//打印魔方
{
for(j=1;j<=n;j++)
printf("%dt",a[i][j]);
printf("n");
}
system("pause");
return 0;
}
法二:
#include<stdlib.h>
#include<stdio.h>
void main()
{
int n,i,p,q;
int a[16][16]={0};
int last_row,last_col;
printf("enter n(n=1 to 15 and n must be odd):");
scanf("%d",&n);
a[1][n/2+1]=1;
last_row=1;
last_col=n/2+1;
for( i=2;i<=n*n;i++)
{
int temp_row=(last_row+n-2)%n+1;
int temp_col=last_col%n+1;
if(a[temp_row][temp_col]!=0 || (last_row==1&&last_col==n))
{
temp_row=last_row%n+1;
temp_col=last_col;
}
a[temp_row][temp_col]=i;
last_row=temp_row;
last_col=temp_col;
}
for(p=1;p<=n;p++)
{
for(q=1;q<=n;q++)
{
printf("%dt",a[p][q]);
}
printf("n");
}
system("pause");
}