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

(一)单偶数阶幻方(即当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. 深入学习:Windows下Git入门教程(下)

    声明:由于本人对于Git的学习还处于摸索阶段,对有些概念的理解或许只是我断章取义,有曲解误导的地方还请见谅指正! 一.分支 1.1分支的概念. 对于的分支的理解,我们可以用模块化这个词来解释:在日常工 ...

  2. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

  3. STL源码分析《3》----辅助空间不足时,如何进行归并排序

    两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在  ...

  4. 【LeetCode OJ】Palindrome Partitioning

    Problem Link: http://oj.leetcode.com/problems/palindrome-partitioning/ We solve this problem using D ...

  5. 破解 AD_CM#3

    系统 : Windows xp 程序 : AD_CM#3 程序下载地址 :http://pan.baidu.com/s/1skwXPVn 要求 : 编写注册机 使用工具 :IDA & OD 可 ...

  6. linux远程连接mysql数据库

    在linux系统中,远程连接mysql数据库时不仅需要开启ip访问,还需要将防火墙中添加相应规则 在wdlinux中的[安全管理]菜单下选择[防火墙[iptables]]选项,增加端口为3306的规则 ...

  7. 通知(Notification) 、 应用间通信(一)

    1 使用通知中心发送消息 1.1 问题 当一个对象需要向多个接受者发送消息的,或者不用知道消息的接收者是谁,就可以使用IOS提供的NSNotificationCenter通知中心,本案例使NSNoti ...

  8. 13年7月memory point

    IOS/android美术资源压缩相关工具使用,shell编写; 美术资源地图压缩方案: IAP支付objc代码添加, iap cracker/iap free防破解方法, sever端增加php验证 ...

  9. Java--继承和super关键字

    一.Java中方法的参数传递(重点) Java中参数传递都是值传递 Java中的值分两种: 1.如果传递的参数是基本数据类型: 传递的值就是基本数据类型的值. 传递的时候,其实是把基本数据类型的值,复 ...

  10. 用java将excel表格中的内容修改后写入到另一个excel中

    package nn; import java.io.File; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl. ...