精华内容
下载资源
问答
  • 偶数阶幻方

    2012-09-26 22:26:28
    解决经典的偶数阶幻方问题,本程序利用C语言编写,阶数可由用户 指定
  • matlab实现双偶数阶幻方的代码,有详细的说明,希望可以帮助到你。
  • 偶数阶幻方

    千次阅读 2016-09-03 14:30:16
    偶数阶幻方 说实话,偶数阶幻方我一直以为只有一种,就是2*n阶幻方问题。查了一下才知道偶数阶幻方也分为两小类。①.4*n阶幻方 4*n阶幻方的生成其实很简单,即对方格中对角线上的数据,先以一条对角线(称对角线...

    .偶数阶幻方
    说实话,偶数阶幻方我一直以为只有一种,就是2*n阶幻方问题。查了一下才知道偶数阶幻方也分为两小类。

    先看看4阶幻方的填法:将数字从左到右、从上到下按顺序填写:

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

    将对角线上的数字,换成与它互补的数字。
    这里,nn+1 = 44+1 = 17;
    把1换成17-1 = 16;把6换成17-6 = 11;把11换成17-11 = 6……换完后就是一个四阶幻方。

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

    对于n=4k阶幻方,我们先把数字按顺序填写。写好后,按44把它划分成kk个方阵。因为n是4的倍数,一定能用44的小方阵分割。然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。 下面是8阶幻方的作法:
    (1) 先把数字按顺序填。然后,按4
    4把它分割成2*2个小方阵

    1 2 3 4 5 6 7 8
    9 10 11 12 13 14 15 16
    17 18 19 20 21 22 23 24
    25 26 27 28 29 30 31 32
    33 34 35 36 37 38 39 40
    41 42 43 44 45 46 47 48
    49 50 51 52 53 54 55 56
    57 58 59 60 61 62 63 64

    (2) 每个小方阵对角线上的数字,换成和它互补的数。

    64 2 3 61 60 6 7 57
    9 55 54 12 13 51 50 16
    17 47 46 20 21 43 42 24
    40 26 27 37 36 30 31 33
    32 34 35 29 28 38 39 25
    41 23 22 44 45 19 18 48
    49 15 14 52 53 11 10 56
    8 58 59 5 4 62 63 1

    好了,4*n阶幻方也完了,怎么样,简单吧!自己动手试试吧。

    ②.4n+2阶幻方
    4
    n+2,乍一看就较4n麻烦了,事实也是如此,不过它的思想也简单。就是将4n+2看做2*(2n+1),这样一来就转化成了四个2n+1求幻方。
    附注:下面的我以6阶幻方为例,那么,4*n+2=6,所以n=1。

    我通过描述每个步骤加上图形的方式来表述4*n+2阶幻方实现的过程。

    第一步:把整个表格分成4个(2n+1)(2*n+1)的小表格,分别叫A,B,C,D。见下图

    这里写图片描述

    第二步:这样A,B,C,D个小表格就成奇数幻方问题了。
    ①.将1,2,…,(2n+1)(2n+1)这些数划分给A,并对A实现奇数幻方;
    ②.将(2
    n+1)(2n+1)+1,…,2*(2n+1)(2n+1)这些数划分给B,并对B实现奇数幻方;
    ③.将2
    (2n+1)(2n+1)+1,…3(2n+1)(2n+1)这些数划分C,并对C实现奇数幻方;
    ④.将3
    (2n+1)(2n+1)+1,…4(2n+1)(2*n+1)这些数划分D,并对D实现奇数幻方。
    见下图

    这里写图片描述

    第三步:从A表中的中心(即第n行的MagicSquare[n][n])开始,按照从左向右的方向,标出n个数,A表中的其他行则标出最左边的n格中的数(在图中用红色背景标出)。并且将这些标出的数和C表中的对应位置互换。见下图

    这里写图片描述

    第四步:在B表中的中心(如上解释)开始,自右向左,标出n-1列,将B中标出的数据与D表中对应位置的数据交换。但是6阶幻方中,n-1此时等于0,所以B与D不用做交换

    这里写图片描述

    展开全文
  • 构造偶数阶幻方的方法(n=4*m)

    千次阅读 2018-10-16 09:53:40
    对于n能被4整除的数,可以这样构造幻方: 1.依次从左到右,从第一行到第n行,按照顺序1,2,…,n^2填充这个矩阵。 2.把上面得到的矩阵分割成m^2个4X4的小矩阵。对于每个4X4小矩阵的两条对角线上的数a,用a的补,n的...

    对于n能被4整除的数,可以这样构造幻方:

    1.依次从左到右,从第一行到第n行,按照顺序1,2,…,n^2填充这个矩阵。

    2.把上面得到的矩阵分割成m^2个4X4的小矩阵。对于每个4X4小矩阵的两条对角线上的数a,用a的补,n的平方+1-a替换掉a。

    即:a <- n^2+a-1

    展开全文
  • 奇数阶偶数阶幻方

    2020-03-09 11:13:44
    首先是奇数幻方,例如:构造一个五阶幻方 -先画一个5*5的表格。把“1”放在中间一列最上边的方格中,从它开始,按对角线方向(从左下往右上)顺次把由小到大的各数放入方格中。 -如果碰到顶,则折向底,如果到达右侧...
    • 首先是奇数幻方,例如:构造一个五阶幻方
      -先画一个5*5的表格。把“1”放在中间一列最上边的方格中,从它开始,按对角线方向(从左下往右上)顺次把由小到大的各数放入方格中。
      -如果碰到顶,则折向底,如果到达右侧,则折向左边。
      -如果进行中轮到方格中已经有数或者到达右上角则退至前一格的下方。一直到所有格子都有数
    • 偶数幻方以4倍的偶数阶方阵为例的构造方法
      -用横线和竖线将n阶方阵划分为m个44的小方阵;
      -将n
      n个数从小到大,从左到右,从上到下依次填入方阵中,遇到44小方阵的对角线不填(此位置不填的数不作为下一个位置填入的数)
      -将n
      n个数从大到小,从左到右,从上到下依次填入方阵中4*4小方阵的对角线.上,其他位置不填(此位置不填的数不作为下一个位置填入的数)
    public class text1{
    public static void main(String[] args){
    	java.util.Scanner s=new java.util.Scanner(System.in);
    	System.out.print("Enter the number:");
        int n=s.nextInt();
    	int square[][]=new int[n][n];
    	if(n%2==1){
    		int j=(n-1)/2,i=0;
    		for(int a=0;a<n*n;){
    			a++;
    			if(square[i][j]==0)
    			{
    				square[i][j]=a;
    				i=(i-1+n)%n;
    				j=(j+1)%n;
    			}
    			else 
    			{
    				i=(i+2)%n;
    				j=(j-1+n)%n;
    				a=a-1;
    			}
    		}
    	}
    	else
    	{
    		int i,j,a=n*n,c=1;
    		for(i=0;i<n;i++){
    			for(j=0;j<n;j++){
    				if(i%4==j%4||i%4+3==j%4||i%4==j%4+3)
    					square[i][j]=a;
    				else 
    					square[i][j]=c;
    				a--;c++;
    			}
    		}
    	}
    	for(int i=0;i<n;i++){
    		for(int j=0;j<n;j++){
    			System.out.format("%3d",square[i][j]);
    		}
    		System.out.println();
    	}
    }
    }
    
    展开全文
  • 一、关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶。  以6阶为例,可由3阶幻方与由0,1,2,3组成的2×2的小方块拼...

    一、关于单偶数阶幻方和双偶数阶幻方

    (一)单偶数阶幻方(即当n=4k+2时)

        任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶。

        以6阶为例,可由3阶幻方与由0,1,2,3组成的2×2的小方块拼成一个6×6的大方块复合而成。

           其中,3阶幻方(洛书)如下图1所示,

          

        (图1)

     将每一单元格分成4等块,各小块的值与单元格的值相同,则行和、列和、对角和均为30,(见图2),记为方阵M

    (图2)

    用由0,1,2,3组成的2×2的小方块拼成一个6×6的大方块,使其行和、列和、对角和均为9,记为方阵N,(见图3

    (图3)

    6阶幻方为方阵4M-N(见图4

    (图4)

    流程图为:

    (二)双偶数阶幻方(即当n=4k时)

    如上图所示,数字可分为有圈型和无圈型。对任意的4k阶幻方,可将其等分为k*k个如上图所示的4×4元组的结构。例如8阶幻方可分成4个上述结构,无圈的按照“自左至右、自上至下”的顺序把1~64个数填上,有圈的先放空;有圈的按照“自右至左,自下至上”的顺序把1~64个数填上,无圈处暂放空。这样即可生成8阶幻方。

    流程图为:

    二、具体代码

    package MagicSquare;
    
    import java.util.Scanner;
    
    import javax.sql.rowset.FilteredRowSet;
    
    public class MagicSquare {
        
        
        //奇数幻方的实现:
        //卢培步法求奇数阶幻方的函数,参数依次是储存幻方的数组的名称、幻方的阶数,
        //标志位flag(为1表示主函数直接调用求奇数阶幻方,为0表示SingleEven_Magic函数进行的调用)
        public static void  Odd_Magic(int array[][],int k ,int flag){
            int i=k,j=(k+1)/2,c=1;
            while (c<=k*k) {
                array[i][j]=c;
                if (c%k==0) {//若c是k的倍数,向上走
                    i-=1;
                }
                else{//若c不是k的倍数,向右下走
                    i+=1;
                    j+=1;
                    if (i>k) {
                        i=1;
                    }
                    if (j>k) {
                        j=1;
                    }
                }
                c++;
            }
            if (flag==1) {
                outputArray(array);
            }
        }
        
        //双偶数幻方:
        //即:阶数能够被4整除的幻方构造函数,参数依次是储存幻方的数组的名称、幻方的阶数
        public static void  DoubleEven_Magic(int array[][],int k) {
            int i=1,j,c1=1,c2=k*k;
            while (i<k) {  //把4k阶看作k*k 个4*4 的方块,将主对角线和反对角线上的元素标记为 -1
                j=1;
                while (j<k) {
                    array[i][j]=array[i+1][j+1]=array[i+2][j+2]=array[i+3][j+3]
                            =array[i][j+3]=array[i+1][j+2]
                            =array[i+2][j+1]=array[i+3][j]= - 1;
                    j+=4;
                }
                i+=4;
            }
            
            for(i=1;i<=k;i++)
                for(j=1;j<=k;j++){
                    
                    //标记为0的进行正向依次赋值(java 在整型数组实例化时将所有元素初始化赋值为0)
                    if (array[i][j]==0) {
                        array[i][j]=c1;
                    }
                    //否则,标记为-1 的进行反向依次赋值。
                    else{
                        array[i][j]=c2;
                    }
                    c1++;
                    c2--;
                }
                outputArray(array);//输出幻方
            
        }
        
        
        //单偶数幻方:
          //即:阶数被4除余2的幻方构造函数,参数依次是储存幻方的数组的名称、幻方的阶数
        public static void  SingleEven_Magic(int array[][],int k) {
            int a[][]=new int[k+1][k+1];
            int b[][]=new int [k+1][k+1];
            int m[][]=new int [k/2+1][k/2+1];
            int i,j;
            
            Odd_Magic(m, k/2, 0);
            
            //由k/2奇数阶幻方衍生出1比4的k阶方阵M
            for(i=1;i<=k/2;i++)
                for(j=1;j<=k/2;j++){
                    a[2*i-1][2*j-1]=a[2*i-1][2*j]=a[2*i][2*j-1]=a[2*i][2*j]=m[i][j];
                }
            
            //构造方阵N
            i=1;j=1;
            while (i<k) {
                j=1;
                while (j<k) {
                    //上半部分A型 1230
                    if (i<k/2||i==k/2&&(j==k/2+2||j==k/2-2)||i==k/2+2&&j==k/2) {
                        b[i][j]=1;
                        b[i][j+1]=2;
                        b[i+1][j]=3;
                        b[i+1][j+1]=0;
                    }
                    //左半部分C型 3102
                    else if(i==k/2&&j<k/2-2){
                        b[i][j]=3;
                        b[i][j+1]=1;
                        b[i+1][j]=0;
                        b[i+1][j+1]=2;
                    }
                    //右半部分D型 2013
                    else if(i==k/2&&j>k/2+2){
                        b[i][j]=2;
                        b[i][j+1]=0;
                        b[i+1][j]=1;
                        b[i+1][j+1]=3;
                    }
                    //6*6 核心中央和两足 1203
                    else if(i==k/2&&j==k/2||i==k/2+2&&(j==k/2+2||j==k/2-2)){
                        b[i][j]=1;
                        b[i][j+1]=2;
                        b[i+1][j]=0;
                        b[i+1][j+1]=3;
                    }
                    //下半部分B型 2103
                    else {
                        b[i][j]=2;
                        b[i][j+1]=1;
                        b[i+1][j]=0;
                        b[i+1][j+1]=3;
                    }
                    j+=2;
                }
                i+=2;    
            }
            
            for(i=1;j<=k;i++)
            for(j=1;j<=k;j++){
                array[i][j]=4*a[i][j]-b[i][j];  //4*M-N 幻方形式
            }
            //outputArray(array);
            System.out.println();
            //两种幻方输出时中间间隔一行;
            for(i=1;i<=k;i++)
            for(j=1;j<=k;j++){
                array[i][j]=a[i][j]+(k/2)*(k/2)*b[i][j];   //M+(k/2)*(k/2)*N 幻方形式
               
            }
             outputArray(array);
        }
        
        //输出幻方的函数,参数是储存幻方的数组的名称
        public static void outputArray (int array[][]) {
            for(int row=1;row<array.length;row++){
                for (int column = 1; column < array[row].length; column++) {
                    System.out.printf("%5d",array[row][column]);
                }
                System.out.println();
            }
        }
        
        
        
        //测试函数
        public static void  main(String args[]) {
            int a[][];
            System.out.println("请输入幻方阶数:");
            Scanner input =new Scanner(System.in);
            int k=input.nextInt();
            a=new int[k+1][k+1];
            
            //阶数为2的幻方不存在
            if (k==2) {
                System.out.println("不存在阶数为2的幻方,请重新输入!");
            }
            //奇数阶幻方
            else if (k%2!=0) {
                Odd_Magic(a, k, 1);
            }
            //4k型幻方(双偶数幻方)
            else if (k%4==0) {
                DoubleEven_Magic(a, k);
            }
            //4k+2型幻方(单偶数幻方)
            else {
                SingleEven_Magic(a, k);
            }
        }
    }

     

    三、结果截图

     

     

    (相关源码详见:https://github.com/shenxiaolinZERO/Resources/tree/master/Resources/Magic_Test

     

     

    将每一单元格分成4等块,各小块的值与单元格的值相同,则行和、列和、对角和均为30,(见图2),记为方阵M

     

    转载于:https://www.cnblogs.com/shenxiaolin/p/5538420.html

    展开全文
  • 该资源包含幻方的构造方法,奇数阶、偶数阶都实现了。是c代码,还归纳了代码的书写思路,非常的全面。看后肯定学的幻方的奥秘。
  • 偶数幻方的算法,是所有幻方里面最难的。至此,所有幻方的算法就讲完了,可以将所有算法合并到一起,成为万能幻方算法。只要在开头部分用 mod 函数判断阶数,调用相应的 VBA ... 双偶阶幻方:n 为偶数,且能被 ...
  • C生成奇数阶幻方矩阵

    千次阅读 2019-03-24 09:57:41
    幻方(Magic Square)是一种将数字安排在...// 求取奇数阶幻方矩阵 #include<stdio.h> #define nums 100 int a[nums][nums]; void get_magicsquares(int n) { if(n % 2 == 0) return; //如果是偶数,...
  • N阶幻方问题

    千次阅读 2012-04-12 12:57:40
    看文章时,看到一个网友谈及N阶幻方的问题。但是讲的比较笼统,奇数偶数口诀之类的。特此在这里整理下,方便自己也方便他人。 奇数阶幻方最经典的填法是罗伯法。如下: 把1(或最小的数)放在第一行正中; 按以下...
  • 幻方算法

    2019-09-28 04:47:04
    一、算法  1、总算法 2、四阶幻方算法 3、奇数阶幻方算法 4、偶数阶幻方算法 二、代码 function createMagicSquare(factor,first...
  • N(奇数)阶幻方解法

    千次阅读 2015-04-01 20:03:27
    因为奇数阶的就只有一个规律,偶数阶的稍微有点复杂(其实我只会4阶,还是从射雕英雄传里面学来的,在写这篇博客的时候我也特地去百度了一下,发现偶数阶的好像不同的阶数规律不一样,所以这儿 就只和大家说说偶数阶...
  • 偶数幻方(4*k+2)

    2020-09-14 17:35:27
    4.因为14阶幻方的k值为3(由4*k+2=14,可知k为2) 所以左边上下两个部分就是交换前k列,其中第k/2+1行需要右移一列(如图所示);右边只需要交换最后面的k-1列即可 ABCD四个区域代码可以调用奇数幻方代码直接得出...
  • 奇数和偶数幻方

    千次阅读 2009-11-12 21:01:00
    n阶幻方的填法(n≥3)幻方,亦称纵横图。台湾称为魔术方阵。将自然数1,2,3,……n*n排列成一个n*n方阵,使得每行、每列以及两对角线上的各个数之和都相等,等于(n*(n*n+1))/2,这样的方阵称为幻方。例如:把1,2,3...
  • 因为奇数阶的就只有一个规律,偶数阶的稍微有点复杂(其实我只会4阶,还是从射雕英雄传里面学来的,在写这篇博客的时候我也特地去百度了一下,发现偶数阶的好像不同的阶数规律不一样,所以这儿 就只和大家说说偶数阶...
  • import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ...奇书阶的是在网上找的 偶数阶的本想自己编可是数学方面参悟不透 大家一起研究一下啊
  • 幻方的构造根据n的取值不同有不不同的解法。n取值为奇数,4的倍数(双偶数),非4的倍数的偶数(单偶数)分别对应3种不同的解法。具体步骤参考百度幻方解法。 接下来放代码 /* *@Date 2019-09-30 *@Author ...
  • 幻方构造法

    2020-05-06 01:49:14
    一,幻方的轮胎模型 把一个n*n的表格平面,上下相接,左右相接,变成一个轮胎。 借用https://www.zhihu.com/question/30498489/answer/49208033的示意图: ...二,奇数阶幻方的构造法 ...三,偶数阶幻方 ...
  • 作者:刘亮幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角...三阶幻方​本篇主聊高阶幻方构造方法的java实现数据结构:以二维数组存放数字例:上面的三阶幻方数组数据如下(不考虑幻方阶次较高...
  • N阶幻方生成器-源代码+exe-VS2019开发 3到31阶幻方自动生成,属于个人兴趣的小玩意,供大家参考。 奇数阶幻方(罗伯法),双偶数阶幻方(对称交换法),单偶数阶幻方(象限对称交换法)
  • 给你一个整数N,然后输出一个N阶幻方。 解题思路: 关于幻方。搜索肯定超时。可是我们能够直接构造一个幻方。就是依据奇数阶(2*M+1)幻方、 单偶数阶(4*M+2)幻方、双偶数阶(4*M)幻方等不同的构造方法来构造。 ...
  • 基于C++的幻方

    千次阅读 2018-12-18 19:13:41
    当n为奇数时,称为奇数阶幻方,当n为偶数时,称为偶阶幻方。当n可被4整除时,称方为双偶幻方。当n不可被4整除时,称为单偶幻方。 多少年来,许多数学家都在研究这个古老而有趣的问题,试图找出一般的解法,但一般都...
  • c++语言幻方

    2012-12-03 23:07:19
    当n为奇数时,称为奇数阶幻方,当n为偶数时,称为偶阶幻方。当n可被4整除时,称方为双偶幻方。当n不可被4整除时,称为单偶幻方。多少年来,许多数学家都在研究这个古老而有趣的问题,试图找出一般的解法,但一般都是...
  • (1)组合数学--幻方

    2020-02-28 14:14:23
    幻方: ...奇数阶幻方:连续摆放法 双偶数阶(4k)幻方:对称法 单偶数(4k+2)幻方:斯特雷奇法 连续摆放法: 摆1在第一行第(n+1)/2列 行号-1,列号+1摆放 有了数字或者到了第0行第n+1列对应的方格,推到前一...
  • 幻方问题

    千次阅读 2012-02-16 20:54:39
    horse法生成奇阶幻方  先在任意一格内放入1。向左走1步,并下走2步放入2(称为马步),向左走1步,并下走2步放入3,依次类推放到n。在n的下方放入n+1(称为跳步),再按上述方法放置到2n,在2n的下边放入2n+1。 ...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

偶数阶幻方