算法:

1. N为奇数:

                1 第一个数“1”填入(0,(n-1/2)位置,记录该数填入位置为(i,j)

                2 下一个数填入位置初步定为(i-1j-1), 等价转换标记为(i',j');

                3 判断i’,j’:

                                I’< 0, j’> 0: 填入位置变为:(n-1, j’);

I’< 0, j’< 0: 填入位置变为:(1, 0);

I’> 0, j’> 0: 填入位置变为:(I’, j’-1);

I’> 0, j’> 0: 填入位置变为:(I’, j’);

                4 继续判断3)中确定的点坐标(假设为(I’’, j’’)):

                                如果没被填过,则最终确定为(I’’,j’’);若已经填过,则变为(I’’+2, j”+1),并继续判断,直到该点没被填写。

                5)在4)中确定的位置处填入数,进入2)填写下一数。

 

2. N4的倍数:

采用对称元素交换法。 首先把数1n×n按从上至下,从左到右顺序填入矩阵,然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)a(n+1-i,n+1-j)交换,所有其它位置上的数不变。

 

3. N4m + 2的偶数:

 1)n阶方阵分为四个小魔方阵ABCD如下排列:      
  B   C  
  D   A  
u=n/2=2*m+1,分为1~u*u,u*u+1~2*u*u,2*u*u+1~3*u*u,3*u*u+1~4*u*u   即在调用子函数的时候分别如下面传递参数:  
  A(0),B(u*u),C(2*u*u),D(3*u*u)  
 分别在ABCD中按照前面的填法把奇数阶填好(注意加上所传参数作为基数,每一个元素都要加上这个值),最后做如下交换:  
  (1)B中第0~(m-1)-1行中元素与C中相对应元素交换 (注意:若m=1,不作此操作!)
  (2)D中第(n-1)-m+1~(n-1)m行的每行中的元素与A中相对应元素交换  
  (3)交换D:(u+m,m)A中对应元素(矩阵中心值)  
  (4)交换D:(n-1,m)A中对应元素(实际为还原AD中原矩阵中最大值到各自位置)  
   
  所谓对应位置,指相对于小魔方阵的左顶角的相对的行列位置

 

参考:

http://zhidao.baidu.com/question/124807422.html

 

 C#实现源码