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

(一)单偶数阶幻方(即当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. Xtreme Toolkit Pro 免费下载地址

    Xtreme Toolkit Pro 是针对Windows程序员的一套先进的用户界面套包,强大的功能可使您的应用程序具有专业的.现代感的外观. Xtreme Toolkit Pro 由8个专业级的构件 ...

  2. linux基础命令学习(一)

    pwd 输出当前工作路径tree 以树状图列出目录的内容ctrl+c 取消命令的执行clear 清空屏幕ls 列出文件目录 蓝色是目录,白色是普通文件alias cls=clear 别名终端:本地终端 ...

  3. 在MyEclipse上搭建web服务器

    a)       Servlet是什么? Servlet(服务器端小程序)是使用Java语言编写的服务器端程序[o1] ,可以使用脚本语言,生成动态的web页. b)      Servlet的架构? ...

  4. php大力力 [009节]php在百度文库的几个基础教程

    2015-08-23 php大力力009. php在百度文库的几个基础教程 php大力力 [009节]php在百度文库的几个基础教程 PHP脚本中操作MySQL数据库3-猿代码平台 php基础教程-绝 ...

  5. 【Tsinghua OJ】多米诺骨牌(domino)问题

    (domino.c/cpp)[问题描述] 小牛牛对多米诺骨牌有很大兴趣,然而她的骨牌比较特别,只有黑色和白色的两种.她觉 得如果存在连续三个骨牌是同一种颜色,那么这个骨牌排列便是不美观的.现在她有n个 ...

  6. EnterpriseLibrary4 自己封装程序集实现log打印

      注意:1)要引用响应的程序集,必须是41的          2)配置文件 using Microsoft.Practices.EnterpriseLibrary.Common.Configura ...

  7. HDU 2829 Lawrence (斜率DP)

    斜率DP 设dp[i][j]表示前i点,炸掉j条边的最小值.j<i dp[i][j]=min{dp[k][j-1]+cost[k+1][i]} 又由得出cost[1][i]=cost[1][k] ...

  8. PDOStatement::bindParam的一个陷阱

    废话不多说, 直接看代码: <?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query ...

  9. 在Silverlight中实施RESTful调用

    在Silverlight中实施RESTful调用:   http://book.51cto.com/art/201006/206314.htm    http://bbs.csdn.net/topic ...

  10. FSM

    一.状态机简单介绍 软件设计中的状态机概念,一般是指有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和 ...