幻方
幻方,有时又称魔方(该称呼现一般指立方体的魔術方塊)或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及两条对角线上的数之和均相等。通常幻方由从
到
的连续整数组成,其中
为正方形的行或列的数目。因此
阶幻方有
行
列,并且所填充的数为从
到
。
幻方可以使用
阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数
,如果填充数为
,那么有
目录 |
[编辑] 幻方简史
[编辑] 洛书
在中国古典文献中记载了洛书的传说:公元前23世纪大禹治水之时,一只巨大的神龟出现于黄河支流洛水中,龟甲上有
种花点的图案,分别代表
这
个数,而
行、
列以及两对角线上各自的数之和均为15,世人称之为洛书。中国汉朝的数术记遗中,称之为九宫算,又叫九宫图
[编辑] 杨辉纵横图
南宋数学家杨辉著《续古摘奇算法》把类似于九宫图的图形命名为纵横图,书中列举3、4、5、6、7、8、9、10阶幻方。其中所述三阶幻方构造法:“九子斜排,上下对易,左右相更,四维挺出,戴九履一,左三右七,二四为肩,六八为足”,比法国数学家Claude Gaspar Bachet提出的方法早三百余年。
[编辑] 构造法
根据构造方法的不同,幻方可以分成三类:奇数阶幻方、
阶幻方和
阶幻方,其中
为自然数,
阶幻方不存在。幻方构造法主要有:连续摆数法、阶梯法(楼梯法)、奇偶数分开的菱形法、对称法、对角线法、比例放大法、斯特雷奇法、LUX法、拉伊尔法(基方、根方合成法)、镶边法、相乘法、幻方模式等。
[编辑] 奇数阶幻方构造法
Siamese方法(Kraitchik 1942年,pp. 148-149)是构造奇数阶幻方的一种方法,说明如下:
- 把
放置在第一行的中间。 - 顺序将
等数放在右上方格中。 - 当右上方格出界的时候,则由另一边进入。
- 当右上方格中已经填有数,则把数填入正下方的方格中。
- 按照以上步骤直到填写完所有
个方格。
(由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)
以下图
阶幻方为例,
填写在
(第一行第三列)的位置上;
应当填写在其右上方格即
中,由于
超出顶边界,所以从最底行进入,即
;
填写在
的右上方格
中;
填写在
的右上方格
中,由于
超出右边界,所以从最左列进入,即
;
填写在
的右上方格
中;
应该填写的方格
已经被
所占据,因此填写在
的正下方格
中;按照上面的步骤直到所有数填入。
![]() |
![]() |
![]() |
阶 |
阶 |
阶 |
魔方阵不是唯一的,比如5阶魔方阵还可以是:
![]() |
阶 |
[编辑] 偶数阶幻方构造法
[编辑]
阶幻方构造法
对于
阶幻方一般都用对调法,制作起来很容易。如4阶幻方的排列法:

按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:

[编辑]
阶幻方构造法
[编辑] 加边法
以
阶为例子,先排出
阶的幻方,如上图,再将图中每一个数都加上
,有下图:

在外围加上一圈格子,把
和
这些数安排在外圈格子内,但要使相对两数之和等于
。对于
这些数是:
;
。
结果如下:

[编辑] 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 4 L U X 2 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]; //所有的數初始化為0 matrix[0][(n-1)/2] = 1; int x = 0,y = (n-1)/2; //count:記住已經插入過的數 for(int count = 2; count<=n*n;count++) while(true) { //先x-1 y+1 x--; y++; //判斷是否可以插入 while(true) {//循環判斷是否越界,直到一個地方不越界為止 //判斷是否越界: //越上界x<0,則移到最下方x=x+n,y不變; continue if(x<0) { x += n; continue; } //越右界y>=n,則y=y-n,x不變;continue if(y>=n) { y -= n; continue; } //循環判斷是否該位置已經有數據,直到找到一個空位 //如果有數據,則移到x = x + 2;y = y - 1; continue if (y<0){y+=n;continue;} if(matrix[x][y] != 0 ) { x += 2;y -= 1; if (x>=n){x-=n;continue;} if (y<0){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.println(); } } 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 66 80 93 106 119 11 13 26 39 52 65 67 92 105 118 10 12 25 38 51 64 77 79 104 117 9 22 24 37 50 63 76 78 91 116 8 21 23 36 49 62 75 88 90 103 7 20 33 35 48 61 74 87 89 102 115 19 32 34 47 60 73 86 99 101 114 6 31 44 46 59 72 85 98 100 113 5 18 43 45 58 71 84 97 110 112 4 17 30 55 57 70 83 96 109 111 3 16 29 42 56 69 82 95 108 121 2 15 28 41 54
[编辑]
阶幻方算法的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() { //初始化matrix matrix = 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_
[编辑] 参见
[编辑] 有用的参考书
- 高治源,九宫图探秘,2004,香港天马图书有限公司
- 张道鑫,素数幻方,2003,香港天马图书有限公司
- 李杭强,趣味数学幻方,2002,香港天马图书有限公司
- 林正禄,开拓智力的奇方——幻方,2001,香港天马图书有限公司

等数放在右上方格中。


