任意阶幻方..

  1 /*@coder Gxjun*/

  2 #include<stdio.h>

  3 #include<string.h>

  4 #include<stdlib.h>

  5 #define maxn 100

  6 int map[maxn][maxn] ;

  7 void creat_magic(int n,int x,int y ,int sn)   //奇阶幻方构造

  8 {

  9     int i,j,k;

 10     i=0;

 11     j=n/2;

 12     for(k=n;k<=n*n;k++)

 13     {

 14         map[i+x][j+y]=k+sn;

 15         if(k%n!=0)

 16         {

 17             if(i!=0)  i--;

 18             else      i=n-1;

 19             if(n==j+1) j=0;

 20             else      j++;

 21         }

 22         else

 23         {

 24             if(i==n-1)i=0;

 25             else    i++;

 26         }

 27     }

 28 }

 29 

 30 void  magic_4(int n)

 31 {

 32     int i,j;

 33     for(i=0 ; i<n ;i++)

 34     {

 35         for(j=0 ; j<n ;j++)

 36         {

 37             if((i%4==0||i%4==3)&&(j%4==0||j%4==3)||(i%4==1||i%4==2)&&(j%4==1||j%4==2))

 38             {

 39                 map[i][j]=n*n-(i*n+j);

 40             }

 41             else

 42             {

 43                 map[i][j]=i*n+j+1;   //i*n+j+n

 44             }

 45         }

 46     }

 47 }

 48 

 49 void magic_other(int n)

 50 {

 51     int i,j,t;

 52     creat_magic(n/2,0,0,0);

 53     creat_magic(n/2,n/2,n/2,n*n/4);

 54     creat_magic(n/2,0,n/2,n*n/2);

 55     creat_magic(n/2,n/2,0,n*n/4);

 56     for(i=0;i<n/2;i++)

 57     {

 58         for(j=0;j<n/4;j++)

 59         {

 60             if(i!=n/4||j!=0)

 61             {

 62                 /*<swap>*/

 63                 t=map[i][j];

 64                 map[i][j]=map[i+n/2][j];

 65                 map[i+n/2][j]=t;

 66             }

 67         }

 68     }

 69             t=map[n/4][n/4];

 70             map[n/4][n/4]=map[n/4+n/2][n/4];

 71             map[n/4+n/2][n/4]=t;

 72         for(i=0;i<n/2;i++)

 73         {

 74             for(j=n-n/4+1 ;j<n;j++)

 75             {

 76                 t=map[i][j];

 77                 map[i][j]=map[i+n/2][j];

 78                 map[i+n/2][j]=t;

 79             }

 80         }

 81 }

 82 int main()

 83 {

 84     int n,i,j;

 85     while(scanf("%d",&n)!=EOF)

 86     {

 87         memset(map,0,sizeof(map));

 88         if(n&1) creat_magic(n,0,0,0);

 89         else if(n%4==0)    magic_4(n);

 90         else magic_other(n);

 91         for(i=0;i<n;i++)

 92         {

 93             for(j=0;j<n;j++)

 94             {

 95                 printf("%d ",map[i][j]);

 96             }

 97             putchar(10);

 98         }

 99     }

100     return 0;

101 }
View Code

 

你可能感兴趣的:(任意阶幻方..)