求解N阶幻方解法.docx

上传人:206****923 文档编号:37509901 上传时间:2018-04-17 格式:DOCX 页数:10 大小:20.84KB
返回 下载 相关 举报
求解N阶幻方解法.docx_第1页
第1页 / 共10页
求解N阶幻方解法.docx_第2页
第2页 / 共10页
求解N阶幻方解法.docx_第3页
第3页 / 共10页
求解N阶幻方解法.docx_第4页
第4页 / 共10页
求解N阶幻方解法.docx_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《求解N阶幻方解法.docx》由会员分享,可在线阅读,更多相关《求解N阶幻方解法.docx(10页珍藏版)》请在金锄头文库上搜索。

1、求解 N 阶幻方解法 2010-04-11 15:17 原帖: http:/ http:/ http:/ 幻方构造方法:(有很多种,这里只举出几种) 奇数阶: n=2*m+1,m 为自然数 1)将数字 1 填在(0,(n+1)/2) ;要注意 c 中是从下标 0 开始 2)从左上往右下依次填。 3)由 2),列的下标出界(超过 n-1)时,行加 1,以 n 为摸的余数为应填的列数; 4)由 2),行的下标出界(超过 n-1)时,列加 1,以 n 为摸的余数为应填的行数; 5)由 2),行列都未出界,但已添上其他数,应在当前位置左横移一个位置进行填 数。 然后是偶数阶: 前一种:n=4*m+2,

2、 m 为自然数 1)将 n 阶方阵分为四个小魔方阵 ABCD 如下排列: B C D A 因为 n*n=4*(2*m+1)*(2*m+1), 记 u=n/2=2*m+1,分为 1u*u,u*u+12*u*u,2*u*u+13*u*u,3*u*u+14*u*u 即在调用子函数的时候分别如下面传递参数: A(0),B(u*u),C(2*u*u),D(3*u*u) 分别在 ABCD 中按照前面的填法把奇数阶填好(注意加上所传参数作为基数,每 一个元素都要加上这个值),最后做如下交换: (1)B 中第 0(m-1)-1 行中元素与 C 中相对应元素交换 (2)D 中第(n-1)-m+1(n-1)共 m

3、 行的每行中的元素与 A 中相对应元素交换 (3)交换 D:(u+m,m)与 A 中对应元素(矩阵中心值) (4)交换 D:(n-1,m)与 A 中对应元素(实际为矩阵最大值 n*n) 所谓对应位置,指相对于小魔方阵的左顶角的相对的行列位置 上面的这些你可以用数学进行证明,利用魔方阵常数(注意 n 阶的和 u 阶的关系)后一种:n=4*m,m 为自然数 因为行列都是 4 的倍数,因而可以将整个矩阵分为每 4*4 的小矩阵。 先判断一个数是否在划为 4*4 小矩阵的对角线上, 如果在,则填该位置的数为 n*n-i+1(i 为该元素的相对位置,从 1 开始,比如 n 阶的第 s 行第 t 个元素则

4、其 i=s*n+t) 如果不在,则填上 i。 _ _ 一个用于构造任意 31024 解幻方的类。VC+6.0 调试通过。 /* *目的:构造任意 n 阶幻方 *作者:zlf *日期:20030728 *方法: *参考 CSDN 上竹林的 pascal 程序 *原理:http:/ */ package CombinationMath; public class MagicSquare private int N; private int Data; public MagicSquare(int n) if(n1) switch(N%4) case 1: case 3: oddCreate();

5、break; case 0: doublyEven(); break; case 2: singleEven(); break; /*奇数阶幻方采用 Siamese 构造方法*/ private void oddCreate() int i,j,value,maxValue; i=0; j=N/2; value=1; maxValue=N*N; while(value=N) j-=N; value+; /* 4K 阶幻方采用 如下方法 * 一次填充 1N*N,并将每个 4X4 小方格的两对角线上的数换成 NN+1-原来 值 */ private void doublyEven() int ma

6、xValue=N*N; int value=1; for(int i=0;i=T) j-=T; value+; public int getResult() return Data; public String toString() String str=new String(); str+=N+“阶幻方构造如下:n“; for(int i=0;i #include int N; int *M=NULL; void main() int i; int check(int,int); void out(); void set_3_5(int,int,int,int); void set_4();

7、 void set_6(); void swap(int,int); printf(“Press any key to start:“); getch(); printf(“r“); Begin: printf(“Input the rank of the Magic Matrix:“); scanf(“%d“, if(Nmod*mod);k+) i_try=i-1,j_try=j-1; if(i_try0)i_try=mod-1; if(j_try0)j_try=mod-1; if(*(M+(i_try+i0)*N+j_try+j0)|i=0 i=i_try;j=j_try; *(M+(i+

8、i0)*N+j+j0)=k+base; void set_4() int i,j,c=N*N; for(i=0;iN;i+) for(j=0;jN;j+) if(check(i,j)*(M+i*N+j)=c-i*N-j; else *(M+i*N+j)=i*N+j+1; void set_6() int i,j,m,u; u=N/2; m=(u-1)/2; set_3_5(0,0,u,u*u); set_3_5(0,u,u,2*u*u); set_3_5(u,0,u,3*u*u); set_3_5(u,u,u,0); for(i=0;im-1;i+) for(j=0;ju;j+) swap(i

9、,j); for(i=0;im;i+) for(j=0;ju;j+) swap(N-1-i,j); swap(u+m,m); swap(N-1,m); void swap(int i,int j) int p=*(M+i*N+j); *(M+i*N+j)=*(M+i*N+j+N/2); *(M+i*N+j+N/2)=p; void out() int i,j; FILE *fp; float c=(float)N*(float)N*(float)N+1)/2; fp=fopen(“Magic.txt“,“wb+“); if(fp=NULL) printf(“Create file ERROR!n“); exit(0); else printf(“007nYou can find the result in the Magic.txt where you run the program.n“); for(i=0;iN;i+) for(j=0;jN;j+) fprintf(fp,“%8d“,*(M+i*N+j); fprintf(fp,“n“); fprintf(fp,“Magic Matrix rank=%d,Magic constant=%.0f.n“,N,c); fclose(fp);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号