幻方算法.docx
- 文档编号:2158033
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:12
- 大小:20.43KB
幻方算法.docx
《幻方算法.docx》由会员分享,可在线阅读,更多相关《幻方算法.docx(12页珍藏版)》请在冰豆网上搜索。
幻方算法
幻方算法
首先,奇数的幻方,第一行中间放1,然后依次2、3、4一直往右上填,越界则反向,如果该位置有了数字,则排在前一个数的下面。
原则:
非右上则下
其次,4的倍数的的幻方。
设N%4等于0,则以每个4*4画对角,不在对角线上的数字与相对应数字对换。
比如8*8的,(0,1)与(7,6)对换,类推。
原则:
横竖下标对N比余,相等或相加等于3则忽略,不做对换
最后,最复杂的最后一种情况,单偶数的幻方。
我找了资料,但是没有完全好用的,总有缺陷
概念:
N=4m+2
方法1:
AC
DB
按上图将其分为4个部分,分别填入1-N*N/4组成的奇数幻方,N*N/4+1-N*N/2组成的奇数幻方,N*N/2+1-N*N/4*3组成的奇数幻方,N*N/4*3-N*N组成的奇数幻方
将AD中m列互换。
不是镜面互换,而是平移。
将BC中m-1列互换,同上。
方法2:
LUX法
LUX
411414
232332
先做一个N/2的奇数幻方,然后把这个幻方的每个数x替换成一个田字的四个数(x-1)*4+1——x*4
这四个数的排列顺序有3种,前m+1行的按L排列,后m-1行的按X排列,中间一行中间一列按L排列,其余的按U排列。
下面是我写的JAVA实现类,2种单偶数我都实现了(第一种方法的实现被我注释掉了),还有一个监测的方法,仅供参考。
publicclassHuanClass{
privateintN;
privateintSUM;
privateintMAX;
privateint[][]RE;
publicHuanClass(intval)throwsException{
N=val;
MAX=N*N;
if(MAX%2==1)SUM=(MAX+1)/2*N;
elseSUM=(MAX+1)*N/2;
RE=newint[N][N];
if(N<3)
thrownewException("shit");
elseif(N%2==1)
RE=CountOdd(N);
elseif(N%4==0)
CountFour();
else
CountEven();
}
privateint[][]CountOdd(intn){
int[][]IRE=newint[n][n];
inti=0;
intj=n/2;
inttmp=1;
while(true){
if(j>=n)j=0;if(i<0)i=n-1;
if(IRE[i][j]==0){IRE[i--][j++]=tmp++;}
else{i+=2;j--;if(j<0)j=n-1;if(i>=n)i=i%n;
if(IRE[i][j]==0)IRE[i--][j++]=tmp++;
elsebreak;
}
}
returnIRE;
}
privatevoidCountFour(){
intfillCount=1;
for(inti=0;i for(intj=0;j RE[i][j]=fillCount; fillCount++; } } inttmp; for(inti=0;i for(intj=0;j if(i%4! =j%4&&(j%4+i%4)! =3){ tmp=RE[i][j]; RE[i][j]=RE[N-i-1][N-j-1]; RE[N-i-1][N-j-1]=tmp; } } } } /* privatevoidCountEven(){ inthalfN=N/2; int[][]tmpIArr=CountOdd(halfN); for(inti=0;i for(intj=0;j RE[i][j]=tmpIArr[i][j]; RE[i+halfN][j]=tmpIArr[i][j]+halfN*halfN*3; RE[i][j+halfN]=tmpIArr[i][j]+halfN*halfN*2; RE[i+halfN][j+halfN]=tmpIArr[i][j]+halfN*halfN; } } intm=(halfN-1)/2; inttmp; for(intj=0;j for(inti=0;i tmp=RE[i][j]; RE[i][j]=RE[i+halfN][j]; RE[i+halfN][j]=tmp; if(j tmp=RE[i][j+halfN]; RE[i][j+halfN]=RE[i+halfN][j+halfN]; RE[i+halfN][j+halfN]=tmp; } } } }*/ privatevoidCountEven(){ inthalfN=N/2; intm=(halfN-1)/2; int[][]Seq=CountOdd(halfN); char[][]SeqSign=newchar[halfN][halfN]; for(inti=0;i for(intj=0;j SeqSign[i][j]='L'; } } inti=halfN-1; for(intl=1;l for(intj=0;j SeqSign[i][j]='X'; } } for(intj=0;j if(j==halfN/2) SeqSign[i][j]='L'; else SeqSign[i][j]='U'; } for(i=0;i for(intj=0;j intbeginNum=(Seq[i][j]-1)*4; switch(SeqSign[i][j]){ case'L': RE[i*2][j*2]=beginNum+4; RE[i*2+1][j*2]=beginNum+2; RE[i*2][j*2+1]=beginNum+1; RE[i*2+1][j*2+1]=beginNum+3; break; case'U': RE[i*2][j*2]=beginNum+1; RE[i*2+1][j*2]=beginNum+2; RE[i*2][j*2+1]=beginNum+4; RE[i*2+1][j*2+1]=beginNum+3; break; case'X': RE[i*2][j*2]=beginNum+1; RE[i*2+1][j*2]=beginNum+3; RE[i*2][j*2+1]=beginNum+4; RE[i*2+1][j*2+1]=beginNum+2; break; } } } } publicint[][]getHuan(){ returnRE; } publicbooleancheck(){ for(inti=0;i inttmpSum1=0; inttmpSum2=0; for(intj=0;j tmpSum1+=RE[i][j]; tmpSum2+=RE[j][i]; } if(tmpSum1! =SUM||tmpSum2! =SUM)returnfalse; } intsum1=0,sum2=0; for(inti=0;i sum1+=RE[i][i]; sum2+=RE[i][N-1-i]; } if(sum1! =SUM||sum2! =SUM)returnfalse; returntrue; } } 幻方 维基百科,自由的百科全书 跳转到: 导航,搜索 幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。 通常幻方由从1到N2的连续整数组成,其中N为正方形的行或列的数目。 因此N阶幻方有N行N列,并且所填充的数为从1到N2。 幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数M2(N),如果填充数为,那么有 [编辑]幻方简史 [编辑]洛书 在中国古典文献中记载了洛书的传说: 公元前23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有9种花点的图案,分别代表这9个数,而3行、3列以及两对角线上各自的数之和均为15,世人称之为洛书。 中国汉朝的数术记遗中,称之为九宫算,又叫九宫图 [编辑]杨辉纵横图 南宋数学家杨辉著《续古摘奇算法》把类似于九宫图的图形命名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。 其中所述三阶幻方构造法: “九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家ClaudeGasparBachet提出的方法早三百余年。 [编辑]构造法 根据构造方法的不同,幻方可以分成三类: 奇数阶幻方、4M阶幻方和4M+2阶幻方,其中M为自然数,2阶幻方不存在。 幻方构造法主要有: 连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。 [编辑]奇数阶幻方构造法 Siamese方法(Kraitchik1942年,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)中;按照上面的步骤直到所有数填入。 3阶 5阶 9阶 [编辑]偶数阶幻方构造法 [编辑]4M阶幻方构造法 对于4M阶幻方一般都用对调法,制作起来很容易。 如4阶幻方的排列法: 按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图: [编辑]4M+2阶幻方构造法 [编辑]加边法 以6阶为例子,先排出4阶的幻方,如上图,再将图中每一个数都加上8m+2=10,有下图: 在外围加上一圈格子,把和这些数安排在外圈格子内,但要使相对两数之和等于16m(m+1)+5。 对于m=1这些数是: 1,2,3,4,5,6,7,8,9,10;27,28,29,30,31,32,33,34,35,36。 结果如下: [编辑]LUX法 在(4M+2)×(4M+2)個方格的適當格點上,先排出2M+1階的幻方。 在首M+1行的格點,全部標上「L」,除了第M+1行中間的是標「U」;在第M+2行的格點,全部標上「U」,除了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法