N阶魔方的C#实现
2010-02-25 12:11
183 查看
算法:
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#实现源码
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#实现源码
相关文章推荐
- word ppt excel文档转换成pdf的C#实现代码
- 设计模式之C#实现---- ProtoType
- 排序算法--选择排序(Selection Sort)_C#程序实现
- C#实现QQ接口软件--QQ的HTTP接口协议探究
- C#实现序列化和反序列化
- 排序算法--希尔排序(Shell Sort)_C#程序实现
- C#实现SQL数据库备份与恢复
- C#实现闪动托盘图标示例
- C#实现文件下载代码
- C#实现文件拖放并打开文件
- C#实现关闭某个指定程序
- C#复制和深度复制的实现方法
- C# ConcurrentBag实现
- C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
- 支付宝Payto接口的c#.net实现 (一)
- C#模拟实现Union
- 用C#实现HTTP协议下的多线程文件传输(转)
- c# winform 程序实现 复数基本运算
- C# web实现word 转Html、office转Html、pdf转图片 在线预览文件
- c#实现GB2312和UTF8字符编码方式的转换!