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

(一)单偶数阶幻方(即当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. In p = new Fred(), does the Fred memory “leak” if the Fred constructor throws an exception?

    No. If an exception occurs during the Fred constructor of p = new Fred(), the C++ language guarantee ...

  2. 统计文件夹下java代码行数的小程序--主要是学习任务队列的思想

    首先感谢czbk的老师,录制的视频,让我们有这么好的学习资料.……—— 统计文件夹java文件的行数,首先想到的肯定是用递归的方法,因为文件夹下面可能包含文件夹,用递归的方法,代码容易写.(这和写简单 ...

  3. BZOJ 3181 BROJ

    像我这种SB还是早点退役. #include<iostream> #include<cstdio> #include<cstring> #include<al ...

  4. 关于python3 OpenCV的安装和配置

    开发环境,win7 32bit, Anaconda3.之前尝试pip安装,但是总是不成功.后来,交流群里面废帝大神让我用conda安装,之后按照conda install --channel http ...

  5. React Native 组件之TextInput

    React Native 组件之TextInput类似于iOS中的UITextView或者UITextField,是作为一个文字输入的组件,下面的TextInput的用法和相关属性. /** * Sa ...

  6. HDU2222 (AC自动机)

    AC自动机模板题. 被卡内存了 死活A不掉.. AC自动机参考教程: http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html ...

  7. stdobj to array php

    The lazy one-liner method You can do this in a one liner using the JSON methods if you're willing to ...

  8. suse linux修改hostname

    SUSELinux中修改hostname需要修改以下两个文件 $vi /etc/HOSTNAME $vi /etc/hosts 然后重启系统即可.

  9. UI学习笔记---第十一天UITableView表视图高级-自定义cell

    自定义cell,多类型cell混合使用,cell自适应高度 自定义cell就是创建一个UITableViewCell的子类 把cell上的空间创建都封装在子类中,简化viewController中的代 ...

  10. python 数据结构之单链表的实现

    链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点都包含结点本身的信息和指向下一个结点的地址.由于每个结点都包含了可以链接起来的地址信息,所以用一个变量就 ...