n阶魔方

#include <stdio.h>

#define N 100

int a[N][N];

 

void magic(int n)

{

       int i,j,t,u,v,x,y;

      

       //奇数阶(2k+1)

       if(n%2!=0)

       {

              y=(n+1)/2;x=y+1;

              for(i=1;i<=n*n;i++)

              {

                     a[x][y]=i;

                     if(i%n==0) x+=2;

                     else

                     {

                            x+=1;

                            y+=1;

                     }

                     if(x>n) x-=n;

                     if(y>n) y-=n;

              }

       }

      

       //双偶阶(4k)

       if(n%4==0)   

       {

              t=n*n;

              for(i=1;i<=n;i++)

                     for(j=1;j<=n;j++)

                            if((i-j)%4==0 || (i+j-1)%4==0)

                            {

                                   a[i][j]=t;

                                   t-=1;

                            }

                            else

                            {

                                   a[i][j]=n*(i-1)+j;

                                   t-=1;

                            }

                           

       }

      

       //单偶阶(4k+2)

       if(n%4!=0 && n%2==0)

       {

              u=n/2;v=u*u;y=(u+1)/2;x=y+1;t=y;

              for(i=1;i<=u*u;i++)

              {

                     a[x][y]=i;a[x][y+u]=i+2*v;

                     a[x+u][y]=i+3*v;a[x+u][y+u]=i+v;

                     if(i%u==0)

                            x+=2;

                     else

                     {

                            x+=1;

                            y+=1;

                     }

                     if(x>u) x-=u;

                     if(y>u) y-=u;

              }

             

              for(i=1;i<=u;i++)

              {

                     for(j=1;j<=n;j++)

                            if(j<=t-1 || j>=n-t+3)

                            {

                                   x=a[i][j];a[i][j]=a[i+u][j];a[i+u][j]=x;

                            }

                            x=a[t][1];a[t][1]=a[t+u][1];a[t+u][1]=x;

                            x=a[t][t];a[t][t]=a[t+u][t];a[t+u][t]=x;

              }

       }

      

}

 

void main()

{

       int n,i,j;

       scanf("%d",&n);

      

    magic(n);

      

       for(i=1;i<=n;i++)

       {

              for(j=1;j<=n;j++)

                     printf("%5d",a[i][j]);

              printf("/n");

       }

      

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值