算法:
1. N为奇数:
1) 第一个数“1”填入(0,(n-1)/2)位置,记录该数填入位置为(i,j);
2) 下一个数填入位置初步定为(i-1,j-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. N为4的倍数:
采用对称元素交换法。 首先把数1到n×n按从上至下,从左到右顺序填入矩阵,然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
3. N为4m + 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中对应元素(实际为还原A、D中原矩阵中最大值到各自位置)
所谓对应位置,指相对于小魔方阵的左顶角的相对的行列位置
参考:
http://zhidao.baidu.com/question/124807422.html
C#实现源码