幻方算法

合集下载

幻方解法

幻方解法

幻方解法
幻方,就是对于一个n×n的方阵,将1—n²这n²个数填入其中,使每行每列以及对角线上的数字之和都相等的方阵。

幻方分为奇数阶幻方(n=2k+1)、单偶数幻方
(n=4k+2)、双偶数幻方(n=4k)三种,每种幻方解法不同,但都有其固定的解。

下面我来具体介绍下幻方的解法:
1.奇数阶幻方
①将1填入第一行中间位置
②向右上方向依次填入
③如果上方出格了,则将其填入最后一行与其同列的位置
④如果右方出格了,则将其填入第一列与其同行的位置
⑤如果右上都出格,则将其填入第一列最后一格
⑥如果将要填入的方格已有数字,则填入上一个数字的下方
这里已三阶幻方为例:
2.双偶数阶幻方(n=4k):
①先将1,2,3……n²依次填入方阵中
②拟出方阵对角线
③对角线上数字不动,将其余所有数字移至与其中心对称的位置
这里以四阶幻方为例

↓ 3.单偶数阶幻方(n=4k+2):
①先将1,2,3……n平方依次填入方阵中
②拟出对角线,将对角线上所有数字移至与其中心对称的位置。

③从方阵左半部分的每一列数字中抽出一对上下对称的数字互换位置(每一列抽出一对)
④从方阵上半部分的每一行数字中抽出一对左对称的数字互换位置(每一行抽出一对)
注:已经移动过或换过位置的数字不能再移动或换位
这里以六阶幻方为例:

↓②↓

↓③↓

↓④↓。

幻方解题技巧

幻方解题技巧

六阶幻方
幻和是:6×(62+1)÷2=111
构 成
三阶幻方构成方法之一
九子斜排 上下对易 左右更替 四维挺出
三阶幻方构成方法之二
画格辅助 九子斜排 送子回家 清除辅助
1
4 7
8 9
2
5
6
3
9
3
1
7
这种方法适用于所有的 奇阶幻方
1
6
11 24 7
2 20 3 4 5 10
16 4
21 22
偶阶幻方 都可以照这样的方法去填
如;八阶幻方

十阶幻方 十二阶幻方
神 奇
四阶幻方
幻和
是34
16+13+1+4

5+2+12+15 3+8+9+14
16+2+11+5 9+7+4+14 3+13+8+10 6+12+1+15

左右对开并交换, 也是一个四阶幻方
上下对开并交换 仍是一个四阶幻方
纵向切开,交换后再接起来
横切一刀,交换后再接起来
距 离 幻 方 中 心 41 的 任 何 中 心 对 称 位 置 上 两 数 和 都 为 82
九阶幻方
将 幻 方 按 图 中 粗 线 分 成 九 块 , 即 为 九 个 三 阶 幻 方
若把上述九个三阶幻方的每个幻方的“幻和”值写在九宫格中,又构成一个新的三阶幻方

分类 构成 神奇
分 类


按照纵横各有数字的个数,可以分为: 三阶幻方、 四阶幻方、 五阶幻方、 六阶幻方… … 按照纵横数字数量奇偶的不同,可以分为: 奇阶幻方 偶阶幻方

幻方常规解法汇总

幻方常规解法汇总

幻方常规解法汇总没法,组合数学还考幻方构造。

这东西不看解法真不会写,虽然没见有啥用,但还是记录下,免得日后再找。

按目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。

下面按这三类幻方,列出最常用解法(考试用,不求强大,只求有效!)。

奇数阶幻方(罗伯法)奇数阶幻方最经典的填法是罗伯法。

填写的方法是:把1(或最小的数)放在第一行正中;按以下规律排列剩下的(n×n-1)个数:1、每一个数放在前一个数的右上一格;2、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;3、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;4、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;5、如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。

例,用该填法获得的5阶幻方:双偶数阶幻方(对称交换法)所谓双偶阶幻方就是当n可以被4整除时的偶阶幻方,即4K阶幻方。

在说解法之前我们先说明一个“互补数”定义:就是在n 阶幻方中,如果两个数的和等于幻方中最大的数与1 的和(即n×n+1),我们称它们为一对互补数。

如在三阶幻方中,每一对和为10 的数,是一对互补数;在四阶幻方中,每一对和为17 的数,是一对互补数。

双偶数阶幻方的对称交换解法:先看看4内外四个角对角上互补的数相易,(方阵分为两个正方形,外大内小,然后把大正方形的四个对角上的数字对换,小正方形四个对角上的数字对换)即(1,16)(4,13)互换(6,11)(7,10)互换即可。

对于n=4k阶幻方,我们先把数字按顺序填写。

写好后,按4×4把它划分成k×k个方阵。

因为n是4的倍数,一定能用4×4的小方阵分割。

然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。

幻方的算法-Merzirac法生成奇阶幻方

幻方的算法-Merzirac法生成奇阶幻方

幻方的算法—Merzirac法生成奇阶幻方奇阶幻方当n为奇数时,我们称幻方为奇阶幻方。

可以用Merzirac法与loubere法实现,Merzirac法与loubere 法称为斜步法,即向斜方向走一步;也可用国际象棋之马步也可构造出更为神奇的奇幻方,故命名为horse法,即马步法。

下面我详细介绍Merzirac法Merzirac法生成奇阶幻方Merzirac法最简单的方法为:1、在第一行居中的方格内放1 ;2、以后按顺序,向右斜上方填写数字(称为斜步);3、若出到方阵上方,把该数字填到本该所在列的最下格;4、若出到方阵右方,把该数字填到本该所在行的最左格;5、若右上已有数字,或出到方阵右上(即对角线方向),则把数字填入上一个数字的下一格,即在n 的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下方放入2n+1,在3n的下方放入3n+1,……依次填完所有数字即可完成任何一个奇阶幻方。

下面是用此方法构成的5阶幻方,每一行、每一列、对角线的和都为65,我们将此和值称为幻和值,用f(n)表示,f(5)=65。

65656565656565 65 65 65 65 65斜步法可以向4个方向依次填写数字,即右上、右下、左上、左下4个方向,每种斜步都可有2种跳步,即左(右)跳步、上(下)跳步。

下面我总结所有的Merzirac法(斜步法):我们用坐标轴的方法,将左右方向设为X轴,向右为X,向左为-X;将上下方向设为Y轴,向上为Y,向下为-Y。

一般的,令矩阵[1,1]为向右走一步,向上走一步,用X+Y表示,,[-1,0]为向左走一步,用-X表示,[0,-1]为向下走一步,用-Y表示。

则斜步可以表示为X+Y,{X∈{[1,0], [-1,0]},Y∈{[0,1], [0,-1]}}∪{Y∈{[1,0], [-1,0]},X∈{[0,1], [0,-1]}}。

对于X+Y相应的跳步可以为-X,-Y。

那么上面的5阶幻方就是用X+Y斜步(即右上一步),-Y跳步(即向下一步)构成。

幻方_??????

幻方_??????

幻方1.概念简析:幻方:是指横行、竖列、对角线上数的和都相等的数的方阵,具有这一性质的3×3的数阵称作三阶幻方,4×4的数阵称作四阶幻方,5×5的称作五阶幻方……如图为三阶幻方、四阶幻方的标准式样.2.构造幻方常用的方法:(1)适用于所有奇数阶幻方的填法—罗伯法.口诀是:一居上行正中央,后数依次右上连.上出框时往下填,右出框时往左填.排重便在下格填,右上排重一个样.(2)仅适用于三阶幻方—九宫格口诀.口诀是:九宫者,二四为肩,六八为足,左七右三,戴九履一,五居中央。

(3)适用于所有偶数阶幻方的填法—对称交换的方法1.将数依次填入方格中,对角线满足要求。

2.调整行,对角线数不动,对称行的其它数对调;调整列,对角线数不动,对称列的其它数对调。

3.三阶幻方的性质:1.幻和相等,幻和等于9个数的和除以3.2.中间数必位于幻方中心,中间数等于幻和除以3.3.黄金三角: 黄金三角顶点的数为两腰之和除以2.视频描述把0、2、4、6、8、10、12、14、16这9个数填在下面图中的方格内,使每行、每列和每条对角线上的三个数的和都相等。

1.1.请用11、13、15、17、19、21、23、25、27编制一个三阶幻方。

注:此题答案默认为0,正确答案见解析!2.2.把7—15这九个数构成一个三阶幻方。

注:此题答案默认为0,正确答案见解析!3.3.请用1、4、7、10、13、16、19、22、25编制一个三阶幻方。

注:此题答案默认为0,正确答案见解析!视频描述将下面左边方格中的9个数填入右边方格中,使每一行、每一列、每条对角线中的三个数相加的和都相等。

1.1.将图中的数重新排列,使横行、竖行、对角线上的三个数的和都相等。

注:此题答案默认为0,正确答案见解析!2.2.把3、4、5、8、9、10、13、14、15编成一个三阶幻方,并求出幻和是多少?3.3.将图中的数重新排列,使横行、竖行、对角线上的三个数的和都相等。

幻方问题公式

幻方问题公式

幻方问题公式
幻方是一个由数字组成的正方形阵列,其中每行、每列和每个对角线的数字之和都是相同的。

以下是幻方的计算公式:
对于任意n阶幻方,每行、每列和每个对角线的数字之和可以用以下公式表示:
S = n(n^2 + 1) / 2
其中,n是幻方的阶数。

当n为奇数时,称为奇阶幻方。

当n为偶数时,幻方分为双偶幻方和单偶幻方。

对于奇阶幻方,可以使用Merzirac法生成。

具体步骤如下:
1. 在第一行居中的方格内放1,依次向右上方填入2、3、4…。

2. 如果右上方已有数字,则向下移一格继续填写。

3. 如果出到方阵下方,把该数字填到本该填数所在列上方相应的格。

4. 如果出到方阵右方,把该数字填到本该填数所在行的左方相应的格。

5. 如果落步格已有数字,则向上移一格继续填写。

对于偶阶幻方,可以使用以下公式计算每行、每列和每个对角线的数字之和:S = n(n/2)^2 + (n/2)^2
其中,n是幻方的阶数。

幻方解法归纳

幻方解法归纳

在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。

我国古代称为“河图”、“洛书”,又叫“纵横图”。

1、奇数阶幻方——罗伯特法(也有人称之为楼梯法)(如图一:以五阶幻方为例)奇数阶幻方n为奇数(n=3,5,7,9,11……) (n=2×k+1,k=1,2,3,4,5……)奇数阶幻方最经典的填法是罗伯特法(也有人称之为楼梯法)。

填写方法是这样:把1(或最小的数)放在第一行正中;按以下规律排列剩下的n×n-1个数:(1)每一个数放在前一个数的右上一格;(2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;(4)如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;(5)如果这个数所要放的格已经有数填入,处理方法同(4)。

这种写法总是先向“右上”的方向,象是在爬楼梯。

口诀:1居首行正中央,依次右上莫相忘上出格时往下放,右出格时往左放.排重便往自下放,右上出格一个样图一2、单偶数阶幻方()122+=m n ——分区调换法(如图二:以六阶幻方为例)① 把()122+=m n 阶的幻方均分成4个同样的小幻方A 、B 、C 、D(如图二)图二(注意A 、B 、C 、D 的相对位置不能改变,因为12+m 为奇数,所以A 、B 、C 、D 均为奇数阶幻方)② 用连续摆数法在A 中填入21a ——构成幻方,同理,在B 中填入()2221a a ——+、在C中填入()22312a a ——+、在D 中填入()22413a a ——+均构成幻方(2n a =)(如图三) 图三(因为12+m 为奇数,所以A 、B 、C 、D 均为奇数阶幻方,必然可以用连续摆数法构造幻方)③ 在A 的中间一行上从左侧的第二列起取m 个方格,在其它行上则从左侧第一列起取m 个方格,把这些方格中的数与D 中相应方格中的数字对调(如图四):图四不管是几阶幻方,在A 中取数时都要从中间一行的左侧第二列开始;因为当6=n 时,1=m ,所以本例中只取了一个数)④ 在A 中从最右一列起在各行中取1-m 个方格,把这些方格中的数与D 中相应方格中的数字对调。

幻方算法

幻方算法

幻方算法首先,奇数的幻方,第一行中间放1,然后依次2、3、4一直往右上填,越界则反向,如果该位置有了数字,则排在前一个数的下面。

原则:非右上则下其次,4的倍数的的幻方。

设N%4等于0,则以每个4*4画对角,不在对角线上的数字与相对应数字对换。

比如8*8的,(0,1)与(7,6)对换,类推。

原则:横竖下标对N比余,相等或相加等于3则忽略,不做对换最后,最复杂的最后一种情况,单偶数的幻方。

我找了资料,但是没有完全好用的,总有缺陷概念:N=4m+2方法1:ACDB按上图将其分为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法L U X41 14 1423 23 32先做一个N/2的奇数幻方,然后把这个幻方的每个数x替换成一个田字的四个数(x-1)*4+1——x*4这四个数的排列顺序有3种,前m+1行的按L排列,后m-1行的按X排列,中间一行中间一列按L排列,其余的按U排列。

下面是我写的JAVA实现类,2种单偶数我都实现了(第一种方法的实现被我注释掉了),还有一个监测的方法,仅供参考。

public class HuanClass {private int N;private int SUM;private int MAX;private int[][] RE;public HuanClass(int val) throws Exception{N=val;MAX=N*N;if(MAX%2==1)SUM=(MAX+1)/2*N;else SUM=(MAX+1)*N/2;RE=new int[N][N];if(N<3)throw new Exception("shit");else if(N%2==1)RE=CountOdd(N);else if(N%4==0)CountFour();elseCountEven();}private int[][] CountOdd(int n){int[][] IRE=new int[n][n];int i=0;int j=n/2;int tmp=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++;else break;}}return IRE;}private void CountFour(){int fillCount=1;for(int i=0;i<N;i++){for(int j=0;j<N;j++){RE[i][j]=fillCount;fillCount++;}}int tmp;for(int i=0;i<N;i++){for(int j=0;j<N/2;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;}}}}/*private void CountEven(){int halfN=N/2;int[][] tmpIArr=CountOdd(halfN);for(int i=0;i<halfN;i++){for(int j=0;j<halfN;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; }}int m=(halfN-1)/2;int tmp;for(int j=0;j<m;j++){for(int i=0;i<halfN;i++){tmp=RE[i][j];RE[i][j]=RE[i+halfN][j];RE[i+halfN][j]=tmp;if(j<m-1){tmp=RE[i][j+halfN];RE[i][j+halfN]=RE[i+halfN][j+halfN];RE[i+halfN][j+halfN]=tmp;}}}}*/private void CountEven(){int halfN=N/2;int m=(halfN-1)/2;int[][] Seq=CountOdd(halfN);char[][] SeqSign=new char[halfN][halfN]; for(int i=0;i<SeqSign.length;i++){for(int j=0;j<SeqSign[i].length;j++){ SeqSign[i][j]='L';}}int i=halfN-1;for(int l=1;l<m;l++,i--){for(int j=0;j<halfN;j++){SeqSign[i][j]='X';}}for(int j=0;j<halfN;j++){if(j==halfN/2)SeqSign[i][j]='L';elseSeqSign[i][j]='U';}for(i=0;i<halfN;i++){for(int j=0;j<halfN;j++){int beginNum=(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;}}}}public int[][] getHuan(){return RE;}public boolean check(){for(int i=0;i<N;i++){int tmpSum1=0;int tmpSum2=0;for(int j=0;j<N;j++){tmpSum1+=RE[i][j];tmpSum2+=RE[j][i];}if(tmpSum1!=SUM||tmpSum2!=SUM)return false;}int sum1=0,sum2=0;for(int i=0;i<N;i++){sum1+=RE[i][i];sum2+=RE[i][N-1-i];}if(sum1!=SUM||sum2!=SUM)return false;return true;}}幻方维基百科,自由的百科全书跳转到: 导航, 搜索幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

幻方算法首先,奇数的幻方,第一行中间放1,然后依次2、3、4一直往右上填,越界则反向,如果该位置有了数字,则排在前一个数的下面。

原则:非右上则下其次,4的倍数的的幻方。

设N%4等于0,则以每个4*4画对角,不在对角线上的数字与相对应数字对换。

比如8*8的,(0,1)与(7,6)对换,类推。

原则:横竖下标对N比余,相等或相加等于3则忽略,不做对换最后,最复杂的最后一种情况,单偶数的幻方。

我找了资料,但是没有完全好用的,总有缺陷概念:N=4m+2方法1:ACDB按上图将其分为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法L U X41 14 1423 23 32先做一个N/2的奇数幻方,然后把这个幻方的每个数x替换成一个田字的四个数(x-1)*4+1——x*4这四个数的排列顺序有3种,前m+1行的按L排列,后m-1行的按X排列,中间一行中间一列按L排列,其余的按U排列。

下面是我写的JAVA实现类,2种单偶数我都实现了(第一种方法的实现被我注释掉了),还有一个监测的方法,仅供参考。

public class HuanClass {private int N;private int SUM;private int MAX;private int[][] RE;public HuanClass(int val) throws Exception{N=val;MAX=N*N;if(MAX%2==1)SUM=(MAX+1)/2*N;else SUM=(MAX+1)*N/2;RE=new int[N][N];if(N<3)throw new Exception("shit");else if(N%2==1)RE=CountOdd(N);else if(N%4==0)CountFour();elseCountEven();}private int[][] CountOdd(int n){int[][] IRE=new int[n][n];int i=0;int j=n/2;int tmp=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++;else break;}}return IRE;}private void CountFour(){int fillCount=1;for(int i=0;i<N;i++){for(int j=0;j<N;j++){RE[i][j]=fillCount;fillCount++;}}int tmp;for(int i=0;i<N;i++){for(int j=0;j<N/2;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;}}}}/*private void CountEven(){int halfN=N/2;int[][] tmpIArr=CountOdd(halfN);for(int i=0;i<halfN;i++){for(int j=0;j<halfN;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; }}int m=(halfN-1)/2;int tmp;for(int j=0;j<m;j++){for(int i=0;i<halfN;i++){tmp=RE[i][j];RE[i][j]=RE[i+halfN][j];RE[i+halfN][j]=tmp;if(j<m-1){tmp=RE[i][j+halfN];RE[i][j+halfN]=RE[i+halfN][j+halfN];RE[i+halfN][j+halfN]=tmp;}}}}*/private void CountEven(){int halfN=N/2;int m=(halfN-1)/2;int[][] Seq=CountOdd(halfN);char[][] SeqSign=new char[halfN][halfN]; for(int i=0;i<SeqSign.length;i++){for(int j=0;j<SeqSign[i].length;j++){ SeqSign[i][j]='L';}}int i=halfN-1;for(int l=1;l<m;l++,i--){for(int j=0;j<halfN;j++){SeqSign[i][j]='X';}}for(int j=0;j<halfN;j++){if(j==halfN/2)SeqSign[i][j]='L';elseSeqSign[i][j]='U';}for(i=0;i<halfN;i++){for(int j=0;j<halfN;j++){int beginNum=(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;}}}}public int[][] getHuan(){return RE;}public boolean check(){for(int i=0;i<N;i++){int tmpSum1=0;int tmpSum2=0;for(int j=0;j<N;j++){tmpSum1+=RE[i][j];tmpSum2+=RE[j][i];}if(tmpSum1!=SUM||tmpSum2!=SUM)return false;}int sum1=0,sum2=0;for(int i=0;i<N;i++){sum1+=RE[i][i];sum2+=RE[i][N-1-i];}if(sum1!=SUM||sum2!=SUM)return false;return true;}}幻方维基百科,自由的百科全书跳转到: 导航, 搜索幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。

通常幻方由从1到N2的连续整数组成,其中N为正方形的行或列的数目。

因此N 阶幻方有N行N列,并且所填充的数为从1到N2。

幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数M2(N),如果填充数为,那么有[编辑]幻方简史•把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」,除了第M+2行中間的是標「L」;在餘下的M-1行的格點,全部標上「X」。

將格點上的數乘以4,再減4,再按下面的規則加上1至4其中一個數,填入對應的格上:4 1 1 4 1 4L U X2 3 2 3 3 2例子:[ 68 65 96 93 4 1 32 29 60 57 ]17L 24L 1L 8L 15L[ 66 67 94 95 2 3 30 31 58 59 ][ 92 89 20 17 28 25 56 53 64 61 ]23L 5L 7L 14L 16L[ 90 91 18 19 26 27 54 55 62 63 ][ 16 13 24 21 49 52 80 77 88 85 ]4L 6L 13U 20L 22L[ 14 15 22 23 50 51 78 79 86 87 ][ 37 40 45 48 76 73 81 84 9 12 ]10U 12U 19L 21U 3U[ 38 39 46 47 74 75 82 83 10 11 ][ 41 44 69 72 97 100 5 8 33 36 ]11X 18X 25X 2X 9X[ 43 42 71 70 99 98 7 6 35 34 ][编辑]編程語言參考實現[编辑]奇數階幻方算法的Java語言實現/*** @author: contribute to wikipedia according GNU* @description: 用於創建奇數階的幻方*/public class magic_squre_odd {static int matrix[][];static int n;public static void magic_squre_odd_generate() { matrix = new int[n][n];//將所有的數初始化為0for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)matrix[i][j] = 0;matrix[0][(n+1)/2 -1] = 1;int x = 0,y = ((n+1)/2 -1);//count: 記住已經插入過的數for(int count = 2; count<=n*n;count++)while(true){//先x-1 y+1x-=1;y+=1;//判斷是否可以插入while(true){//循環判斷是否越界,直到一個地方不越界為止//判斷是否越界://越上界x<0,則移到最下方x=x+n,y不變; continueif(x<0){x = x + n;continue;}//越右界y>=n,則y=y-n,x不變;continueif(y>=n){y = y - n;continue;}//循環判斷是否該位置已經有數據,直到找到一個空位//如果有數據,則移到x = x + 2;y = y - 1; continue if (y<0){y=y+n;continue;}if(matrix[x][y] != 0 ){x = x + 2;y = y - 1;if (x>=n){x=x-n;continue;}if (y<0){y=y+n;continue;}continue;}break;}//將當前的count值賦給選出的空位matrix[x][y]= count;break;}}public static void print(){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){//System.out.println(matrix[i][j]);System.out.print(matrix[i][j]);System.out.print("_");}System.out.print("\n");}}public static void main(String[] args){ //手工輸入n的值,並確保為奇數n = 11;magic_squre_odd_generate();print();}}以下是本算法將n設置為11時得出的11階幻方的構造結果:68 81 94 107 120 1 14 27 40 53 6680 93 106 119 11 13 26 39 52 65 6792 105 118 10 12 25 38 51 64 77 79104 117 9 22 24 37 50 63 76 78 91116 8 21 23 36 49 62 75 88 90 1037 20 33 35 48 61 74 87 89 102 11519 32 34 47 60 73 86 99 101 114 631 44 46 59 72 85 98 100 113 5 1843 45 58 71 84 97 110 112 4 17 3055 57 70 83 96 109 111 3 16 29 4256 69 82 95 108 121 2 15 28 41 54[编辑] 4阶幻方算法的Java语言实现/*** @author: contribute to wikipedia according GNU* @description: 用于创建4阶的幻方**/public class magic_square_4m {/*** @param args*/static int matrix[][];static int n;static void magic_squre_4m_generate(){//初始化matrixmatrix = new int[n][n];//将matrix里的位置用数顺序排列int ini = 0;for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)matrix[i][j] = ++ini;//打印对调前的样子System.out.println("对调之前的样子:");print();//然后对调(仅对右上方的数进行遍历)for(int i = 0; i < n; i++)for(int j = i + 1; j < n; j++){if(( i != j) && (i + j) != (n -1) ){ //对不在主付对角线上的数关于中心对调int temp;temp = matrix[i][j];matrix[i][j] = matrix[n -1 - i][n - 1 - j];matrix[n -1 - i][n - 1 - j] = temp;}}}public static void print(){for(int i = 0; i < n; i++){for(int j = 0; j < n; j++){System.out.print(matrix[i][j]);System.out.print("_");}System.out.print("\n");}}public static void main(String[] args) {//这里手动设置n的数值为4,这里只能设置为4,因为只求4阶幻方n = 4;magic_squre_4m_generate();System.out.println("对调之后的样子:");print();}}以下是本算法输出的结果:对调之前的样子:1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_对调之后的样子:1_15_14_4_12_6_7_9_8_10_11_5_13_3_2_16_。

相关文档
最新文档