幻方算法
- 格式:doc
- 大小:98.01 KB
- 文档页数:11
幻方解法
幻方,就是对于一个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平方依次填入方阵中
②拟出对角线,将对角线上所有数字移至与其中心对称的位置。
③从方阵左半部分的每一列数字中抽出一对上下对称的数字互换位置(每一列抽出一对)
④从方阵上半部分的每一行数字中抽出一对左对称的数字互换位置(每一行抽出一对)
注:已经移动过或换过位置的数字不能再移动或换位
这里以六阶幻方为例:
↓
↓②↓
↓
↓③↓
↓
↓④↓。
幻方常规解法汇总没法,组合数学还考幻方构造。
这东西不看解法真不会写,虽然没见有啥用,但还是记录下,免得日后再找。
按目前填写幻方的方法,是把幻方分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。
下面按这三类幻方,列出最常用解法(考试用,不求强大,只求有效!)。
奇数阶幻方(罗伯法)奇数阶幻方最经典的填法是罗伯法。
填写的方法是:把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法生成奇阶幻方奇阶幻方当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;}}幻方维基百科,自由的百科全书跳转到: 导航, 搜索幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。
幻⽅算法(转)幻⽅的算法(C++版)⼀、幻⽅按照阶数可分成了三类,即奇数阶幻⽅、双偶阶幻⽅、单偶阶幻⽅。
⼆、奇数阶幻⽅(劳伯法)奇数阶幻⽅最经典的填法是罗伯法。
填写的⽅法是:把1(或最⼩的数)放在第⼀⾏正中;按以下规律排列剩下的(n×n-1)个数:(1)每⼀个数放在前⼀个数的右上⼀格;(2)如果这个数所要放的格已经超出了顶⾏那么就把它放在底⾏,仍然要放在右⼀列;(3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上⼀⾏;(4)如果这个数所要放的格已经超出了顶⾏且超出了最右列,那么就把它放在底⾏且最左列;(5)如果这个数所要放的格已经有数填⼊,那么就把它放在前⼀个数的下⼀⾏同⼀列的格内。
例,⽤该填法获得的5阶幻⽅:17241815235714164613202210121921311182529⼆、双偶数阶幻⽅(海尔法)所谓双偶阶幻⽅就是当n可以被4整除时的偶阶幻⽅,即4K阶幻⽅。
在说解法之前我们先说明⼀个“互补数”定义:就是在n阶幻⽅中,如果两个数的和等于幻⽅中最⼤的数与1的和(即n×n+1),我们称它们为⼀对互补数。
如在三阶幻⽅中,每⼀对和为10的数,是⼀对互补数;在四阶幻⽅中,每⼀对和为17的数,是⼀对互补数。
双偶数阶幻⽅最经典的填法是海尔法。
填写的⽅法是:以8阶幻⽅为例:(1)先把数字按顺序填。
然后,按4×4把它分割成4块(如图)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364(2)每个⼩⽅阵对⾓线上的数字(如左上⾓⼩⽅阵部分),换成和它互补的数。
64236160675795554121351501617474620214342244026273736303133323435292838392541232244451918484915145253111056858595462631三、单偶数阶幻⽅(斯特拉兹法)所谓单偶阶幻⽅就是当n不可以被4整除时的偶阶幻⽅,即4K+2阶幻⽅。
1.暴力搜索法幻方解题的最初方法是暴力搜索法。
这种方法包括列举每个数字的所有可能的排列,然后逐个检查它们是否满足幻方的要求。
虽然这种方法可以解决出所有幻方的问题,但是它对于大型幻方的解题过程中需要耗费大量的时间和精力,并且存在各种漏洞。
2.加1法加1法也称为"Theorems of Kronecker",是一种简单和高效的解题方法。
这种方法基于对任意一个幻方进行加1操作,然后解决一个新的幻方来得到解决幻方的结果。
使用这种方法的缺点是它只能解决特定类型的幻方,而无法解决大部分幻方问题。
3.线性代数法线性代数法是基于矩阵和行列式的组合在内的线性代数来计算幻方。
它使用比"加1法"更加复杂的算法来解决幻方,但是在解决复杂的幻方问题方面非常有效。
线性代数法的基本思路是将幻方转化为一个矩阵,然后对该矩阵进行一系列操作,计算出其行列式,最终得到解决幻方的结果。
a.构造幻方矩阵首先,需要将幻方构造成一个矩阵。
对于一个n阶幻方,矩阵的大小也是n×n。
将幻方中的每个数字都与一个矩阵中的元素相对应,这些元素的值就是幻方中每个数字的值。
b.求出幻方矩阵的行列式然后,需要计算矩阵的行列式。
行列式是一种数学工具,用来计算一个矩阵的性质。
对于一个n阶矩阵,行列式可以用一个n×n的矩阵来表示。
该矩阵的元素是由原矩阵中对应位置的子矩阵的行列式组成的。
c.计算幻方矩阵的行列式的值通过计算幻方矩阵的行列式的值,可以得到该幻方的解题结果。
如果幻方矩阵的行列式的值等于0,则该幻方无解。
如果幻方矩阵的行列式的值为非零数,则可以使用行列式展开式来计算幻方的解题结果。
总体来说,线性代数法是一种非常有效的幻方解题方法。
它比暴力搜索法和加1法更加高效,并且可以解决大多数幻方问题。
但是,这种方法需要使用高级数学知识,需要较高的数学水平才能应用。
4.对称性法对称性法是基于幻方的对称性的一种解题方法。
三阶幻方公式简易口诀三阶幻方是指由1到9的九个数字组成的一个3x3的方阵,使得方阵中的每一行、每一列以及对角线上的数字之和都相等。
下面是一个简单的口诀来求解三阶幻方的公式:首先,我们需要把9个数字按照一定的规律填入到3x3的方阵中。
设置一个3x3的方阵如下:abcdefghi第一步:选取任意一个数字填入中间的位置,比如选取数字5,填入方阵的中心位置e:abcd5fghi第二步:根据魔方的特性,可以得出以下规律:1.真正的幻方中心位置的值将会是(n^2+1)/2,对于三阶幻方来说,中心位置的值为(3^2+1)/2=52.方阵的每个角的位置必须是n的倍数,对于三阶幻方来说,四个角的值即为1、3、7、9根据以上两个规律,我们可以进行以下步骤填充幻方:第三步:将数字1填入到方阵的上一个位置g(此处的上指的是在方阵中“上方”相对于中心位置e的方向):abc15fghi第四步:根据规律2,将数字9填入到方阵的下一个位置f(此处的下指的是在方阵中“下方”相对于中心位置e的方向):abc159ghi第五步:根据规律2,将数字3填入到方阵的下一个位置h(此处的下指的是在方阵中“下方”相对于中心位置e的方向):abc159g3i第六步:根据规律2,将数字7填入到方阵的下一个位置d(此处的下指的是在方阵中“下方”相对于中心位置e的方向):abc15973i第七步:根据规律1,将数字8填入到方阵的下一个位置b(此处的下指的是在方阵中“下方”相对于中心位置e的方向):a8c15973i第八步:根据规律1,将数字4填入到方阵的下一个位置f(此处的下指的是在方阵中“下方”相对于中心位置e的方向):a8c159734最终得到了一个三阶幻方。
利用以上口诀和规律,我们可以通过简单的步骤来构造三阶幻方。
通过这个口诀,我们可以快速而准确地创建出一个三阶幻方,仅需一些简单的数字填充操作。
幻方的规律和方法幻方的规律在于无论取哪一条路线,最后得到的和或积都是完全相同的。
对平面幻方的构造,分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)。
幻方的方法1、N为奇数时,将1放在第一行中间一列;从2开始直到n×n止各数依次按下列规则存放。
⑴将1放在第一行中间一列;⑵从2开始直到n×n止各数依次按下列规则存放:按45°方向行走,如向右下,每一个数存放的行比前一个数的行数减1,列数加1.⑶如果行列范围超出矩阵范围,则回绕。
例如1在第1行,则2应放在最上一行,列数同样加1.⑷如果按上面规则确定的位置上已有数,或上一个数是第1行第n 列时,则把下一个数放在上一个数的上面。
2、N为4的倍数时,采用对称元素交换法。
采用对称元素交换法。
首先把数1到n×n按从上至下,从左到右顺序填入矩阵,然后将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n+1-i,n+1-j)交换,所有其它位置上的数不变。
(或者将对角线不变,其它位置对称交换也可)3、N为其它偶数时当n为非4倍数的偶数(即4n+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。
按上述奇数阶幻方给分解的4个子方阵对应赋值,由小到大依次为上左子阵(i),下右子(i+v),上右子阵(i+2v),下左子阵(i+3v),即4个子方阵对应元素相差v,其中v=n*n/4.四个子矩阵由小到大排列方式为①③④②然后作相应的元素交换:a(i,j)与a(i+u,j)在同一列做对应交换(jn-t+2),a(t-1,0)与a(t+u-1,0);a(t-1,t-1)与a (t+u-1,t-1)两对元素交换,其中u=n/2,t=(n+2)/4上述交换使行列及对角线上元素之和相等。
填幻方的数学心得体会
幻方算法( Magic Square) 学习笔记
一、幻方按照阶数可分成了三类,即奇数阶幻方、双偶阶幻方、单偶阶幻方。
二、奇数阶幻方(劳伯法)
奇数阶幻方最经典的填法是罗伯法。
填写的方法是:
把1(或最小的数)放在第一行正中;按以下规律排列剩下的(nxn-1)个数:
1、每一个数放在前一个数的右上一格;
2、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右
一列;
3、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放
在上一行;
4、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在底行且最左列;
5、如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同
一列的格内。
三、双偶数阶幻方(海尔法)
所谓双偶阶幻方就是当n可以被4整除时的偶阶幻方,即4K阶幻方。
在说解法之前我们先说明一个“互补数”定义:就是在n 阶幻方中,如果两个数的
和等于幻方中最大的数与1的和(即nxn+1),我们称它们为一对互补数。
如在三阶幻方中,每一对和为10 的数,是一对互补数;在四阶幻方中,每一对和为17的数,是一对互补数。
三阶幻方公式三阶幻方是一种数学游戏,它包含一个3x3的矩阵,每行、每列和对角线上的数字和都是15,而各格中的数字则由1到9不等。
它的解法是在空格中填入1到9的数字,使每行、每列和对角线上的数字和都是15。
三阶幻方的解法一般有两种:一种是推理法,即根据每行、每列和对角线上的数字和等于15,来推断哪些数字可以填入,从而找出解法;另一种是公式法,即利用三阶幻方的公式,来计算出空格中应填入的数字。
三阶幻方的公式为:a +b +c = 15d +e +f = 15g + h + i = 15a + d + g = 15b + e + h = 15c + f + i = 15a + e + i = 15g + e + c = 15其中,a、b、c、d、e、f、g、h、i分别代表三阶幻方矩阵中的九个数字。
利用上述公式,可以找出三阶幻方的解法。
例如,假设已知a=3,b=2,c=1,d=9,e=7,f=8,g=4,则可以算出h=5,i=6。
这样就可以确定三阶幻方矩阵中的九个数字,而且每行、每列和对角线上的数字和都是15。
三阶幻方公式是由英国数学家哈里·韦恩斯所发明的,它可以用来解决三阶幻方的谜题,而且相比推理法,它更加方便快捷。
它的出现,不仅节省了解决三阶幻方的时间,而且也更有趣,让更多人喜欢上了这种数学游戏。
三阶幻方不仅是一种普通的数学游戏,它还可以用来培养孩子的数学思维能力。
它的解法可以从几个方面来考虑,如数学逻辑、排列组合和推理等,这些都可以帮助孩子提高解题能力,同时也可以培养孩子的独立思考能力。
总之,三阶幻方公式是一种优秀的算法,它不仅可以解决三阶幻方的谜题,还可以培养孩子的数学思维能力。
它的简单易用,使更多的人喜欢上了这种数学游戏。
三阶幻方算法
三阶幻方算法
第三阶幻方,即三阶普通魔方,又称为3阶方阵,是由三乘三的十八块小正方
形组成的玩具,也是要解决的数独游戏。
三阶魔方是目前最常见的魔方,也是最容易操作的。
它由九块小正方形组成,每一面各有一种颜色,七种颜色可以组成一个三阶魔方:黄色,红色,绿色,白色,蓝色,橙色和黑色。
第三阶幻方的排列采用四元数的数学编码排列,可以将一个三阶魔方表示为一
个4元数(4个数字),数字的安排及大小以及颜色都给定,例如一下的编码表:
黄色:1 红色:2 绿色:3 白色:4
蓝色:5 橙色:6 黑色:7
解决第三阶魔方的关键在于熟悉不同颜色之间的编码。
对于第三阶魔方,先分
析每个面上的九块小正方形,保证每个位置上编码都是正确的,符合数独游戏的规则,并能将所有九块拼到一起,这时候魔方已经是一个完整可以拼接的魔方形状了。
第二步就是将所有块逐一旋转到正确的位置,这需要熟悉颜色顺序和正确的转动顺序,这一步需要花费更多时间。
最后,就是将魔方拼接成完全一样的九宫格,此时魔方就完成了,你可以拿着它大展身手,或者参加比赛。
总之,解第三阶魔方需要了解颜色编码和正确的选择转动顺序,以及尝试以经
验的方式解决第三阶魔方的拼接解决方案。
关于幻方的公式幻方这玩意儿,听起来好像挺神秘莫测的,但其实只要咱好好琢磨,也能把它弄得明明白白。
先来说说啥是幻方。
幻方就是一个正方形的表格,里面填了数字,而且每行、每列和对角线上的数字之和都相等。
就像一个神奇的魔法盒子,怎么加都能得到相同的结果。
咱来看看幻方的公式。
一般来说,对于一个 n 阶幻方,幻和的值可以通过这个公式算出来:幻和 = n×(n² + 1)÷ 2 。
比如说一个 3 阶幻方,那幻和就是 3×(3² + 1)÷ 2 = 15 。
给您讲讲我以前教学生幻方的时候遇到的一件有趣的事儿。
有个小家伙,怎么都搞不明白幻方的公式,愁得小脸都皱起来了。
我就跟他说:“你就把这个幻方想象成一个装满宝贝的宝箱,每行每列和对角线都是通往宝箱的不同通道,而这个幻和就是宝箱里宝贝的总数。
不管你从哪个通道进去,拿到的宝贝都一样多。
”这小家伙眼睛一下子亮了,开始认真琢磨起来。
那怎么用这个公式来构造幻方呢?有很多方法。
比如罗伯法,它就有一套特定的规则。
先把 1 放在第一行的中间,然后依次往右上方填数字。
如果碰到边界了,就转到另一边。
再比如杨辉法。
它是把数字从小到大按顺序斜着填,出了幻方再调整位置。
幻方在数学里的应用可多啦。
像在密码学里,就可以用幻方来加密信息,让别人摸不着头脑。
还有在数学游戏里,幻方能让咱们玩得不亦乐乎。
学习幻方的过程,就像是一场有趣的冒险。
有时候会遇到难题,就像在森林里迷路了一样,但只要不放弃,找到那个公式的线索,就能走出困境,看到美丽的风景。
不管是简单的三阶幻方,还是复杂的高阶幻方,只要掌握了公式和方法,都能轻松应对。
所以啊,别被幻方一开始的神秘样子吓到,跟着公式一步步来,就能揭开它的面纱,发现其中的乐趣和奇妙。
希望您也能在幻方的世界里畅游,感受数学的魅力!。
幻方的三条规律
幻方的规律和方法参考如即可:奇数、填充法,中心数字规定、对称法,规定幻方的数字范围、转换法,数字出现限定、组合法,每列对角线平等、算法法。
一、幻方的规律和方法
1、奇数:幻方的阶数必须是奇数,如3、5、7、9等。
2、填充法:填充法是最简单的幻方构建方法,从中心数字开始,按照顺序填充数字,按照规律构建幻方。
二、幻方的规律和方法
1、中心数字规定:幻方的中心数字必须是阶数的一半加一,如3阶幻方的中心数字为2,5阶幻方的中心数字为3。
2、对称法:对称法是一种快速构建幻方的方法,先构建一个对称幻方,再进行变换得到目标幻方。
三、幻方的规律和方法
1、规定幻方的数字范围:幻方的数字范围必须从1开始,连续到阶数的平方,如3阶幻方的数字范围为1~9,5阶幻方的数字范围为1~25。
2、转换法:转换法是一种基于对称性的幻方构建方法,通过对幻方进行旋转、翻转等变换,得到目标幻方。
四、幻方的规律和方法
1、数字出现限定:幻方的每个数字只能出现一次。
2、组合法:组合法是一种将多个幻方组合在一起构建新幻方的方法,可以得到更复杂的幻方。
五、幻方的规律和方法
1、每列对角线平等:幻方的每行、每列和对角线上的数字之和必须相等。
2、算法法:算法法是一种通过数学公式构建幻方的方法,需要较高的数学水平和计算能力,但可以得到更多样化的幻方。
幻方算法首先,奇数的幻方,第一行中间放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_。