潘松 2021-05-16 10:16 根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M + 2阶幻方,其中M为自然数,2阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。奇数阶幻方构造法Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:把1放置在第一行的中间。 顺序将等数放在右上方格中。 当右上方格出界的时候,则由另一边进入。 当右上方格中已经填有数,则把数填入正下方的方格中。 按照以上步骤直到填写完所有N2个方格。 (由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)以5阶幻方为例,1填写在(1,3)(第一行第三列)的位置上;2应当填写在其右上方格即(0,4)中,由于(0,4)超出顶边界,所以从最底行进入,即(5,4);3填写在(5,4)的右上方格(4,5)中;4填写在(4,5)的右上方格(3,6)中,由于(3,6)超出右边界,所以从最左列进入,即(3,1);5填写在(3,1)的右上方格(2,2)中;6应该填写的方格(1,3)已经被1所占据,因此填写在(2,2)的正下方格(3,2)中;按照上面的步骤直到所有数填入。偶数阶幻方构造法4M阶幻方构造法对于4M阶幻方一般都用对调法,制作起来很容易。如4阶幻方的排列法:1 2 3 45 6 7 89 10 11 1213 14 15 16按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:1 15 14 412 6 7 98 10 11 513 3 2 164M+2阶幻方的求解方法 加边法以6阶为例子,先排出4阶的幻方,如上图,再将图中每一个数都加上8m + 2 = 1011 25 24 1422 16 17 1918 20 21 1523 13 12 26在外围加上一圈格子,把和这些数安排在外圈格子内,把1到8M+2和4m*4m+8m+3到(4m+2)*(4m+2)安排到外圈格子内,但要使相对两数之和等于16m(m + 1) + 5。有了这些公式算法,我们就可以用程序语言来实现它了首先,这是一个十阶的幻方也就是说我们要用4M+2阶幻方的模式来实现他,其中M=2;并且要先求出4*2也就是8阶幻方,在把下面是我编的C语言算法:#in优艾设计网_设计clude "stdio.h"void mian(){ int arr[10][10]; int no=1; for(int i=1;i<9;i++) { for(int j=1;j<9;j++) { arr[i][j]=no; no++; } } for(int i=1;i<5;i++) { for(int j=1;j<9;j++) { if(i=j||i=(9-j)) contine; else { int need=0; need=arr[i][j]; arr[i][j]=arry[9-i][9-j]; arry[9-i][9-j]=need; } } } for(int i=1;i<9;i++) { for(int j=1;j<9;j++) { arr[i][j]=arr[i][j]+18; } } int a[18],b[18]; int q=1,w=83; for(int i=0;i<18;i++) { a[i]=q; b[i]=w; q++; w++; } for(int i=1;i<9;i++) { for(int j=1;j<9;j++) { if(j=8) printf("%d",arr[i][j]); else printf("%d",arr[i][j]) } } for(int i=0;i<18;i++) { printf("%d",a[i]); printf("%d",b[i]); }}因为我没有C编译器,所以我就只有这样把没检验过的代码给你了,我说明一下,我这个编译的是8*8的二维数组的幻方,公式也给你了,也许答案和你的不一样,但是绝对是正确的,楼主可以验算,至于为什么我没有加上其他二方,那是因为我暂时还没有想到有更优化的方法来实现4M+2种类的幻方方法,只能把他剩下的二方数字输出来,让别人自己填,我也就能做到这样了,打了大半天,虽说不完美,但是也只有将就了
潘孟乐 2021-05-16 10:29 根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M + 2阶幻方,其中M为自然数,2阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。奇数阶幻方构造法Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:把1放置在第一行的中间。 顺序将等数放在右上方格中。 当右上方格出界的时候,则由另一边进入。 当右上方格中已经填有数,则把数填入正下方的方格中。 按照以上步骤直到填写完所有N2个方格。 (由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)以5阶幻方为例,1填写在(1,3)(第一行第三列)的位置上;2应当填写在其右上方格即(0,4)中,由于(0,4)超出顶边界,所以从最底行进入,即(5,4);3填写在(5,4)的右上方格(4,5)中;4填写在(4,5)的右上方格(3,6)中,由于(3,6)超出右边界,所以从最左列进入,即(3,1);5填写在(3,1)的右上方格(2,2)中;6应该填写的方格(1,3)已经被1所占据,因此填写在(2,2)的正下方格(3,2)中;按照上面的步骤直到所有数填入。偶数阶幻方构造法4M阶幻方构造法对于4M阶幻方一般都用对调法,制作起来很容易。如4阶幻方的排列法:1 2 3 45 6 7 89 10 11 1213 14 15 16按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:1 15 14 412 6 7 98 10 11 513 3 2 164M+2阶幻方的求解方法 加边法以6阶为例子,先排出4阶的幻方,如上图,再将图中每一个数都加上8m + 2 = 1011 25 24 1422 16 17 1918 20 21 1523 13 12 26在外围加上一圈格子,把和这些数安排在外圈格子内,把1到8M+2和4m*4m+8m+3到(4m+2)*(4m+2)安排到外圈格子内,但要使相对两数之和等于16m(m + 1) + 5。有了这些公式算法,我们就可以用程序语言来实现它了首先,这是一个十阶的幻方也就是说我们要用4M+2阶幻方的模式来实现他,其中M=2;并且要先求出4*2也就是8阶幻方,在把下面是我编的C语言算法:#include "stdio.h"void mian(){ int arr[10][10]; int no=1; for(int i=1;i<9;i++) { for(int j=1;j<9;j++) { arr[i][j]=no; no++; } } for(int i=1;i<5;i++) { for(int j=1;j<9;j++) { if(i=j||i=(9-j)) contine; else { int need=0; need=arr[i][j]; arr[i][j]=arry[9-i][9-j]; arry[9-i][9-j]=need; } } } for(int i=1;i<9;i++) { for(int j=1;j<9;j++) { arr[i][j]=arr[i][j]+18; } } int a[18],b[18]; int q=1,w=83; for(int i=0;i<18;i++) { a[i]=q; b[i]=w; q++; w++; } for(int i=1;i<9;i++) { for(int j=1;j<9;j++) 优艾设计网_设计模板 { if(j=8) printf("%d",arr[i][j]); else printf("%d",arr[i][j]) } } for(int i=0;i<18;i++) { printf("%d",a[i]); printf("%d",b[i]); }}因为我没有C编译器,所以我就只有这样把没检验过的代码给你了,我说明一下,我这个编译的是8*8的二维数组的幻方,公式也给你了,也许答案和你的不一样,但是绝对是正确的,楼主可以验算,至于为什么我没有加上其他二方,那是因为我暂时还没有想到有更优化的方法来实现4M+2种类的幻方方法,只能把他剩下的二方数字输出来,让别人自己填,我也就能做到这样了,打了大半天,虽说不完美,但是也只有将就了
赵毅杰 优艾设计网_设计圈 2021-05-16 10:31
《百子回归图》10×10共100个格子,每个格子内填上1至100,使每行、每列的十个数之和分别为505,两条对角线上十个数字之和也分别为505。
上图石碑名为《澳门回归百子图》。仔细推敲此图,可谓其妙无穷。最显眼的是,第五行、第六行与第五列、第六列相交的四个格子上的数字特意漆成红色,它们是分别是19、99、12、20———1999年12月20日,这正是澳门回归祖国的日子。
精彩评论