魔方阵 奇数偶数都成立(2)

续(1),现在写一个直接输入任意大于3的整数的程序,直接判断其是否为魔方阵,程序如下:

#include<stdio.h>
#include<string.h>
#define M 100
int main()
{
int n,a[M][M];
void output(int a[][M],int n);
void J_MFZ(int a[][M],int n);
void SO_MFZ(int a[][M],int n);
void DO_MFZ(int a[][M],int n);
void check(int a[][M],int n);
printf("请输入n,n为大于3的整数:\n");
while(scanf("%d",&n)!=EOF&&n>=3)
{
memset(a,0,sizeof(a));
if(n%2)
{
J_MFZ(a,n);
output(a,n);
check(a,n);
}
else if(n%4==0)
{
SO_MFZ(a,n);
output(a,n);
check(a,n);
}
else
{
DO_MFZ(a,n);
output(a,n);
check(a,n);
}
printf("请输入n,n为大于3的整数:\n");

}
return 0;
}
void output(int a[][M],int n) //输出魔方阵函数
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
putchar('\n');
}

}
void J_MFZ(int a[][M],int n) //奇魔方阵函数
{
int x,y,i,j,k;
a[0][n/2]=1;
i=0;
j=n/2;
for(k=2;k<=n*n;k++)
{
x=i;
y=j;
i--;
j++;
if(i<0)i=n-1;
if(j>n-1)j=0;
if(a[i][j]!=0)
{
i=x+1;
j=y;
}
a[i][j]=k;
}
}

void SO_MFZ(int a[][M],int n) //双偶魔方阵函数
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i<n/2&&j<n/2||i>=n/2&&j>=n/2)
{
if(i%2==0&&j%2==1||i%2==1&&j%2==0)
a[i][j]=1;
}
else
{
if(i%2==0&&j%2==0||i%2==1&&j%2==1)
a[i][j]=1;
}
}
k=n*n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(a[i][j]==1)
a[i][j]=k;
k--;
}
k=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(a[i][j]==0)
a[i][j]=k;
k++;
}

}

void DO_MFZ(int a[][M],int n) //单偶数魔方阵
{
int i,j,t,m;
J_MFZ(a,n/2);
m=(n-2)/4;
for(i=n/2;i<n;i++)
for(j=n/2;j<n;j++)
a[i][j]=a[i-n/2][j-n/2]+n/2*n/2;
for(i=0;i<n/2;i++)
for(j=n/2;j<n;j++)
a[i][j]=a[i+n/2][j]+n/2*n/2;
for(i=n/2;i<n;i++)
for(j=0;j<n/2;j++)
a[i][j]=a[i-n/2][j+n/2]+n/2*n/2;
//换数字
//C与B换
for(i=0;i<n/2;i++)
for(j=n/2;j<n;j++)
if(j>m+1+n/2)
{
t=a[i][j];
a[i][j]=a[i+n/2][j];
a[i+n/2][j]=t;
}

//换(m+1,m+1)
t=a[m][m];
a[m][m]=a[m+n/2][m];
a[m+n/2][m]=t;
//换A,D数字
for(i=0;i<n/2;i++)
for(j=0;j<n/2;j++)
if(j<m)
{
if(i==m&&j==0)continue;
t=a[i][j];
a[i][j]=a[i+n/2][j];
a[i+n/2][j]=t;
}

}
void check(int a[][M],int n)
{
int i,j,s,m,p=1;
m=(1+n*n)*n*n/2/n;
for(i=0;i<n;i++)//检测行
{
s=0;
for(j=0;j<n;j++)
s+=a[i][j];
if(s!=m)
{
p=0;
break;
}
}
for(j=0;j<n;j++) //检测列
{
s=0;
for(i=0;i<n;i++)
s+=a[i][j];
if(s!=m)
{
p=0;
break;
}
}

s=0;
for(i=0;i<n;i++)//检测对角线
s+=a[i][i];
if(s!=m)p=0;

s=0;
for(i=0;i<n;i++)
s+=a[i][n-1-i];
if(s!=m)p=0;


if(p==0)printf("不是魔方阵\n\n");
else
printf("是魔方阵,其相加相等的数为%d.\n\n",m);

}


有错误或其它请予以指正!

posted @ 2012-03-10 22:42  龙杉老师  阅读(703)  评论(0编辑  收藏  举报