//幻方
#include<stdio.h>
void f1(int n)//奇数
{
int i,a[30][30];//a[j][k]
int j=0,k=(n-1)/2;
for(i=1;i<=n*n;i++)
{
a[j][k]=i;
if(i%n==0)j++;
else
{
if(j!=0)j--;
else j=n-1;
if(k!=(n-1))k++;
else k=0;
}
}
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
printf("%d ",a[j][k]);
printf("\n");
}
}
void f2(int n)//双偶
{
int i=1,j,k,a[30][30],temp;//a[j][k]
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
a[j][k]=i;
i++;
}
}
for(j=0;j<n/2;j++)
{
for(k=n/4;k<n/4*3;k++)
{
temp=a[j][k];
a[j][k]=a[n-1-j][k];
a[n-1-j][k]=temp;
}
}
for(j=n/4+1;j<=n/4*3;j++)
{
for(k=0;j<n/2;j++)
{
temp=a[j][k];
a[j][k]=a[j][n-1-k];
a[j][n-1-k]=temp;
}
}
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
printf("%d ",a[j][k]);
printf("\n");
}
}
void f3(int n)//单偶
{
int i,temp,a[30][30];//a[j][k]
int m=(n-2)/4;
int j=0,k=(n/2-1)/2;
for(i=1;i<=n*n/4;i++)//FuZhi
{
a[j][k]=i;
if(i%(n/2)==0)j++;
else
{
if(j!=0)j--;
else j=n/2-1;
j%=(n/2);
if(k!=(n/2-1))k++;
else k=0;
k%=(n/2);
}
}
for(j=0;j<n/2;j++)
{
for(k=0;k<n/2;k++)
{
a[j+n/2][k+n/2]=a[j][k]+n*n/4;
a[j][k+n/2]=a[j][k]+n*n/2;
a[j+n/2][k]=a[j][k]+n*n*3/4;
}
}
for(j=0;j<n/2;j++)//ac
{
if(j==(n-2)/4)
{
for(k=((n/2)-1)/2;k<(n/2-1)/2+m;k++)
{
temp=a[j][k];
a[j][k]=a[j+n/2][k];
a[j+n/2][k]=temp;
}
}
else
{
for(k=0;k<m;k++)
{
temp=a[j][k];
a[j][k]=a[j+n/2][k];
a[j+n/2][k]=temp;
}
}
}
for(j=0;j<n/2;j++)//bd
{
for(k=n*3/4;k>n*3/4-(m-1);k--)
{
temp=a[j][k];
a[j][k]=a[j+n/2][k];
a[j+n/2][k]=temp;
}
}
for(j=0;j<n;j++)//output
{
for(k=0;k<n;k++)
printf("%d ",a[j][k]);
printf("\n");
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n%2==1)f1(n);
else if(n%4==0) f2(n);
else f3(n);
}
return 0;
}
written by Sneexy
思路参考:
日志标题:《魔方阵算法及C语言实现》
日志链接:http://furzoom.com/magic-square/
博客名称:枫竹梦
下面这种方法来实现对奇幻方的处理更灵活(对应替换代码f1)