主题:幻方的方法是什么
//who知道这种的方法,加一点注释
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void hf1(int n,int *p)
{
int m=1,i,j,k,l;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
*(p+i*n+j)=0;
for(i=0,j=(n-1)/2;;){
*(p+i*n+j)=m++;
if(m>n*n)
break;
k=i-1;
l=j+1;
if(k==-1)
k=n-1;
if(l==n)
l=0;
if(*(p+k*n+l)!=0){
i++;
continue;
}
i=k;
j=l;
}
}
void hf2(int n,int *p)
{
int i,j,*q;
q=malloc(n*n/2);
hf1(n/2,q);
for(i=0;i<n/2;i++){
for(j=0;j<n/2;j++){
*(p+i*n+j)=*(q+i*n/2+j);
*(p+(i+n/2)*n+j+n/2)=*(p+i*n+j)+n*n/4;
*(p+i*n+j+n/2)=*(p+(i+n/2)*n+j+n/2)+n*n/4;
*(p+(i+n/2)*n+j)=*(p+i*n+j+n/2)+n*n/4;
}
}
for(i=0;i<n/2;i++){
for(j=0;j<(n/2-1)/2;j++)
swap(p+i*n+j,p+(i+n/2)*n+j);
for(j=n-1;j>=n-(n-4)/4;j--)
swap(p+i*n+j,p+(i+n/2)*n+j);
}
swap(p+(n/2-1)/2*n,p+(3*n/2-1)/2*n);
swap(p+(n/2-1)/2*n+(n/2-1)/2,p+(3*n/2-1)/2*n+(n/2-1)/2);
}
void hf3(int n,int *p)
{
int i,j,k,m=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
*(p+i*n+j)=m++;
for(k=0;k<n;k+=4){
for(i=k,j=0;j<n/2;i++,j++){
if(i==n)
i=0;
swap(p+i*n+j,p+(n-1-i)*n+n-1-j);
}
for(i=k,j=n-1;j>=n/2;i++,j--){
if(i==n)
i=0;
swap(p+i*n+j,p+(n-1-i)*n+n-1-j);
}
}
}
void main()
{
int i,j,n,*p;
printf("Enter n:");
scanf("%d",&n);
p=malloc(2*n*n);
if(n%2!=0)
hf1(n,p);
else if(n%4!=0)
hf2(n,p);
else
hf3(n,p);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%-4d",*(p+i*n+j));
printf("\n\n");
}
}
#include <stdio.h>
#include <stdlib.h>
void swap(int *a,int *b)
{
int t;
t=*a;
*a=*b;
*b=t;
}
void hf1(int n,int *p)
{
int m=1,i,j,k,l;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
*(p+i*n+j)=0;
for(i=0,j=(n-1)/2;;){
*(p+i*n+j)=m++;
if(m>n*n)
break;
k=i-1;
l=j+1;
if(k==-1)
k=n-1;
if(l==n)
l=0;
if(*(p+k*n+l)!=0){
i++;
continue;
}
i=k;
j=l;
}
}
void hf2(int n,int *p)
{
int i,j,*q;
q=malloc(n*n/2);
hf1(n/2,q);
for(i=0;i<n/2;i++){
for(j=0;j<n/2;j++){
*(p+i*n+j)=*(q+i*n/2+j);
*(p+(i+n/2)*n+j+n/2)=*(p+i*n+j)+n*n/4;
*(p+i*n+j+n/2)=*(p+(i+n/2)*n+j+n/2)+n*n/4;
*(p+(i+n/2)*n+j)=*(p+i*n+j+n/2)+n*n/4;
}
}
for(i=0;i<n/2;i++){
for(j=0;j<(n/2-1)/2;j++)
swap(p+i*n+j,p+(i+n/2)*n+j);
for(j=n-1;j>=n-(n-4)/4;j--)
swap(p+i*n+j,p+(i+n/2)*n+j);
}
swap(p+(n/2-1)/2*n,p+(3*n/2-1)/2*n);
swap(p+(n/2-1)/2*n+(n/2-1)/2,p+(3*n/2-1)/2*n+(n/2-1)/2);
}
void hf3(int n,int *p)
{
int i,j,k,m=1;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
*(p+i*n+j)=m++;
for(k=0;k<n;k+=4){
for(i=k,j=0;j<n/2;i++,j++){
if(i==n)
i=0;
swap(p+i*n+j,p+(n-1-i)*n+n-1-j);
}
for(i=k,j=n-1;j>=n/2;i++,j--){
if(i==n)
i=0;
swap(p+i*n+j,p+(n-1-i)*n+n-1-j);
}
}
}
void main()
{
int i,j,n,*p;
printf("Enter n:");
scanf("%d",&n);
p=malloc(2*n*n);
if(n%2!=0)
hf1(n,p);
else if(n%4!=0)
hf2(n,p);
else
hf3(n,p);
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%-4d",*(p+i*n+j));
printf("\n\n");
}
}