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

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

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

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

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

(图1)

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

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

(图2)

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

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

(图3)

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

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

(图4)

流程图为:

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

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

800x600

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

如上图所示,数字可分为有圈型和无圈型。对任意的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

800x600

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

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

MicrosoftInternetExplorer4

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman","serif";}

Java 实现任意N阶幻方的构造的更多相关文章

  1. Java 实现奇数阶幻方的构造

    一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...

  2. 任意N阶幻方算法实现

    算法原理请参考:https://www.zhihu.com/question/23531676 先定义一些通用的函数,比如创建空幻方,删除幻方,打印幻方. 创建幻方 int **NewMagicS(i ...

  3. 任意阶幻方(魔方矩阵)C语言实现

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  4. hdu1998 bjfu1272奇数阶幻方构造

    这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...

  5. codeforces 710C Magic Odd Square(构造或者n阶幻方)

    Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...

  6. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  7. n阶幻方

    前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...

  8. n阶幻方问题

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发 ...

  9. java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序

    java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ...

随机推荐

  1. Python入门(三,初级)

    一,函数调用 定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构. 这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行. 如下实例调用了pr ...

  2. PHP面向对象中常用的关键字和魔术方法

    PHP面向对象中常用的关键字 final        1.final不能修饰成员属性(类中常量不是用这个关键字)        2.final只能修饰类和方法 作用:            使用fi ...

  3. Activity与Service通信(不同进程之间)

    使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communicat ...

  4. [SYSU]每周一赛

    2014年每周一赛第一场 A.Cutting Sausages                                        B.Rectangular Fields //待做    ...

  5. JavaScript string.format

    //string.format String.prototype.format=function(){ var e = this, f = arguments.length; if (f > 0 ...

  6. ld链接问题解决

    http://stackoverflow.com/questions/480764/linux-error-while-loading-shared-libraries-cannot-open-sha ...

  7. 面向过程部分 Java 和 C++ 的区别

    前言 Java 和 C++ 在面向过程部分区别并不大,但还是有的,本文罗列了这些区别. 在 Java 中: 1. 数据类型的范围和机器无关 2. 加上前缀 0b 可以表示二进制数,如 0b1001 就 ...

  8. Codeforces Round #298 (Div. 2) B. Covered Path

    题目大意: 一辆车,每秒内的速度恒定...第I秒到第I+1秒的速度变化不超过D.初始速度为V1,末速度为V2,经过时间t,问最远能走多远. 分析 开始的时候想麻烦了.讨论了各种情况.后来发现每个时刻的 ...

  9. hdu 5203

    题目大意: 有n根连续的木棒,其中有m根是坏的,现在要求将木棒切成连续的四段,使得其中三段中都不包含坏的木棒,且三段木棒的长度和最大,在最长的前提下看这三段木棒能否拼成三角形,如果能的话,问最多有多少 ...

  10. webrtc编译之libcommonaudio

    [170/1600] CXX obj/webrtc/common_audio/common_audio.audio_util.o[171/1600] CXX obj/webrtc/common_aud ...