#include <stdio.h>
#define N 16 //这里可以修改N的值
int main()
{
int a[N][N],i,j,k,p,n;
p=1;
while(p==1) /*要求阶数为1~15的商数*/
{
printf("Enter n(n=1~15):"); //可以输入小于等于N-1的整数 scanf("%d",&n);
if((n!=0)&&(n<=N-1)&&(n%2!=0)) p=0;
}
for(i=1;i<=n;i++) /*初始化*/
for(j=1;j<=n;j++)
a[i][j]=0;
j=n/2+1; /*建立魔方阵*/
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
i=i-1;
j=j+1;
if((i<1)&&(j>n))
{ i=i+2;
j=j-1; }
else
{ if(i<1) i=n;
if(j>n) j=1; }
if(a[i][j]==0) a[i][j]=k;
else
{ i=i+2;
j=j-1;
a[i][j]=k; }
}
for(i=1;i<=n;i++) /*输出魔方阵*/
{ for(j=1;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n"); }
return 0;
}
魔方阵算法:
(1)将1放在第一行中间一列
(2)从2开始直到n*n止个数一次按下列规则存放,每一个数存放的行比前一个数的列数减1,行数加1
(3)如果上一数的行数为1,,则下一个数的行数为n
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1
(5)如果按上面的规则确定的位置上已有数,或上一个数是第一行的n列时,则把下一个数放在上一个数的下面
————————算法很难理解
#include<stdio.h>
#define MAX 20
void main()
{
int i,j,k,n;
int a[MAX][MAX]={0};
printf("请输入魔法矩阵的行数(或列数)\n");
do{
scanf("%d",&n);
if(n%2==0)
printf("\n请输入一个奇数(<20)\n");
}while(n%2==0);
i=0;
j=n/2;
a[i][j]=1;
for(k=2;k<=n*n;k++)
{
if(a[(i-1+n)%n][(j+1)%n]==0)
{
i=(i-1+n)%n;
j=(j+1)%n;
}
else
i=(i+1)%n;
a[i][j]=k;
}
printf("\n下面是%d维魔方的展示:\n",n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%10d",a[i][j]);
putchar('\n');
}
#include <stdio.h>
#define M 100
void main()
{
int m,mm,i,j,k,ni,nj;
int magic[M][M]={0};
printf("please input the date:\n");
for(;;)
{
scanf("%d",&m);
if(m<=0 || m%2==0)
{
printf("input error,please try again:\n"); continue;
}
else break;
}
mm=m*m;
i=0;
j=m/2;
for(k=1;k<=mm;k++)
{
magic[i][j]=k;
if(i==0)
ni=m-1;
else
ni=i-1;
if(j==m-1)
nj=0;
else
nj=j+1;
if(magic[ni][nj]==0)
{
i=ni;
j=nj;
}
else
i++;
}
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
printf("%6d",magic[i][j]); printf("\n");
}
}。