
幻方算法研究.doc
8页根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4 M 阶幻方和 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)中;按照上面的步骤直到所有数填入。
3 阶 5 阶 9 阶魔方阵不是唯一的,比如 5 阶魔方阵还可以是:5 阶[编辑] 偶数阶幻方构造法[编辑] 4 M 阶幻方构造法对于 4M 阶幻方一般都用对调法,制作起来很容易如 4 阶幻方的排列法:按如上图排列好,再将非主副对角线上的各个数关于中心对调,即成下图:[编辑] 4 M + 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];//所有的數初始化為 0matrix[0][(n-1)/2] = 1;int x = 0,y = (n-1)/2;//count:記住已經插入過的數for(int count = 2; count=n,則 y=y-n,x 不變;continueif(y>=n){y -= n;continue;} //循環判斷是否該位置已經有數據,直到找到一個空位//如果有數據,則移到 x = x + 2;y = y - 1; continueif (y=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 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_。












