巧排魔方阵

Author: 江苏 高健青 Date: 1994-07-01

        如果用排列组合的方法寻找魔方阵,一则编程比较麻烦,更重要的是随着n的增大,计算量呈几何级数上升,结果要等上老半天才能出来。如果能掌握魔方阵的规律,那就简单多了。行数、列数为n的魔方阵有各种排法,没有共同的规律,但满足下述条件的方阵一定是魔方阵:
        一、第一行的中间列位置的数是1。
        二、若数K是n的整数倍,则数K+1在数K的下方,若数K在最后一行,则数K+1在第一行对应的位置上。
        三、若数K不是n的整数倍,则数K+1在数K的右上方,即数K的行减-、列加一的位置上。若数K在第一行,则数K+1在最后一行相对应的位置上;若数K在最后一列,则数K+1在第一列相应的位置上。
        根据以上条件很容易排出一个阶数为n的魔方阵,若将这个魔方阵对称的行或列互换,就可以得到一系列新的魔方阵。
        下面是我编的排魔方阵,只要稍作修改,应可扩大允许的n的范围,理论上可扩至n≤46339。该程序在SUPER386上用TURBO C2.0编译,连接后运行通过。
        main()
        {
        int n=0,m,i,j,k,a[32][32];
        while(n%2==0) {
        printf("enter the umnber of n\n");
             scanf("%ld",&n);
        }
        m=n*n;
        i=1;
        j=(n+1)/2;k=1;
          while(k<=m) {
        if(i==0) i=n;
        if(j>n) j=1;
        if(k%n!=0) a[i--][j++]=k++;
        else a[i++][j]=k++;
        }
        for(i=1;i<=n;i++) {
        for(j=1;j<=n;j++) printf("%4d",a[i][j]);
        printf("\n");
        }
        }
        
        (江苏   高健青)