//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");
    }
}