前言:

本章介绍幻方的基本知识,同时利用Matlab 和 Python 构造简单的幻方方阵。

最后用幻方结合图像,展示了一个渐进的魔幻效果。


幻方定义:

简单介绍
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

幻方包括:奇数幻方、单偶数幻方和双偶数幻方
单偶数幻方(即4n+2式):幻方阶数n为不能被4整除的偶数,比如6、10、14
双偶数幻方(即4n式):幻方行列数n能被4整除的幻方,比如4、8、12


1算法说明:

1.1 杨辉九宫图构造3解幻方:

1.2 奇数阶幻方构造:

1.第0行最中间为1
2.下一个位置是右上方,如5、6;若越界,将沿行、列方向看成环形,如2、3
3.若当前位置是n的倍数,表示一条对角线已满,则下一个位置是本列下一行,如4、7

1.3 双偶数阶幻方构造:

1.3.1 简单的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

用Matlab如下:

>> A = magic(4)A =16     2     3    135    11    10     89     7     6    124    14    15     1

1.3.2 n = 4k 的双偶数幻方

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

以 n = 8为例:

将n * n个数从小到大,从左到右,从上到下依次填入方阵中,遇到4 * 4小方阵的对角线不填(此位置不填的数不作为下一个位置填入的数),再将n * n个数从大到小,从左到右,从上到下依次填入方阵中4 * 4小方阵的对角线上,其他位置不填(此位置不填的数不作为下一个位置填入的数)

Python的实现代码摘要如下:

import java.util.Scanner;
public class MagicSquare {public static void main(String[] args) {System.out.println("请选择想输出幻方的阶数:");Scanner sc = new Scanner(System.in);int n = sc.nextInt();int array[][] = new int[n][n];if (n%2!=0){  //奇数阶oddMagic(n,array);}else if (n%4!=0){  //单偶数阶return;}else{  //双偶数阶doubleEvenMagic(n,array);}printSquare(array);}public static void oddMagic(int n,int array[][]){int i = 0;int j = n/2;for (int k = 1; k <= n*n; k++) {array[i][j] = k;if (k%n==0) {  //如果当前数字是n的倍数,向下走i++;}else{  //如果当前数字不是n的倍数,向左上走i--;j++;if (i<0) i=n-1;if (j>n-1) j=0;}}}public static void doubleEvenMagic(int n,int array[][]){int c1=1,c2=n*n;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (i%4==j%4||(i+j)%4==3){  //对角线则反排array[i][j] = c2;}else{  //非对角线正排array[i][j] = c1;}c2--;c1++;}}}public static void singleEvenMagic(int n,int array[][]){System.out.println("思考ing...待更新...");}public static void printSquare(int array[][]){for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {System.out.printf("%4d",array[i][j]);}System.out.println();}}
}
————————————————
版权声明:本文为CSDN博主「绀香零八」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_45475271/article/details/104624990

1.3 单偶数阶幻方构造:

单偶阶幻方:n 为偶数,且不能被4整除

  • n=6,10,14,18,22……
  • n=4k+2,k=1,2,3,4,5……

所谓单偶数, 指的是形如n=2(2m+1)的偶数, 其中m为自然数。即能被2除尽, 而不能被4除尽的偶数。双偶数自然就是能被4除尽的偶数。

单偶数阶幻方的构造比双偶数阶幻方、奇数阶幻方的构造更加困难。

二步法是构造奇数阶幻方的利器, 能否由n=2m+1阶幻方产生n=2(2m+1)阶幻方, 其中m为自然数?能, 有经典的斯特雷奇(Ralph Strachey)法和LUX法。

我们的四步法(不包括构造奇数阶幻方时的那两步), 可给读者提供另一种选择, 三种方法对同一个n=2m+1阶幻方而言, 所产生的n=2(2m+1)阶幻方是完全不同的。

方法1:【案,具体参阅参考3】

方法2:【案,具体参阅参考4】

摘录以 n = 10 为例:此时,依据公式n=4k+2,k=2,

  • 先把方阵分为如下 A、B、C、D 四个象限,每一个象限都是奇数幻方

  • 用罗伯法,按顺序在 A、B、C、D 象限填数

  • 自 A 象限的中间行、中间列开始,自左向右,标出 k 格。A 象限的其他行则标出最左边的 k 格
  • D 象限同上

  • 将 A、D 象限标出的这些格互换位置

  • 自 C 象限的中间列起,自右向左,标出 k-1 列
  • B 象限同上
  • * 注:6 阶幻方由于 k-1=0,所以不用再做 C、B 象限的数据交换

将 C、B 象限标出的这些格互换位置,10 阶幻方即已完成


2 Matlab 的幻方函数:

M = magic(n) returns an n-by-n matrix constructed from the integers 1 through n2 with equal row and column sums. The order n must be a scalar greater than or equal to 3 in order to create a valid magic square.

函数返回一个幻方矩阵,n 大于等于 3.

例如,3阶幻方

M = magic(3)
M = 3×38     1     63     5     74     9     2
sum(M)
ans = 1×315    15    15

单偶数8阶幻方

>> A = magic(8)A =64     2     3    61    60     6     7    579    55    54    12    13    51    50    1617    47    46    20    21    43    42    2440    26    27    37    36    30    31    3332    34    35    29    28    38    39    2541    23    22    44    45    19    18    4849    15    14    52    53    11    10    568    58    59     5     4    62    63     1
>> sum(A)ans =260   260   260   260   260   260   260   260

3 幻方的图示展示:

Visually examine the patterns in magic square matrices with orders between 9 and 24 using imagesc. The patterns show that magic uses three different algorithms, depending on whether the value of mod(n,4) is 0, 2, or odd.

使用 imagesc 观察 9 阶到 24 阶幻方矩阵的图案。这些图案表明 magic 使用三种不同的算法,取决于 mod(n,4) 的值是 0、2 还是奇数。

for n = 1:16subplot(4,4,n)ord = n+8;m = magic(ord);imagesc(m)title(num2str(ord))axis equalaxis off
end


参考:

(2条消息) n阶幻方【MagicSquare】_绀香零八的博客-CSDN博客

Magic square - MATLAB magic (mathworks.com)

由奇数阶幻方构造单偶数阶幻方的四步法:10阶幻方 - 知乎 (zhihu.com)

[图文]Excel VBA(19) – n阶单偶数幻方算法_单偶数阶幻方_www.wanmei.la

单偶幻方浅探 - 知乎 (zhihu.com)

Matlab 基础应用01 - Python 基础应用 n阶幻方【MagicSquare】和构造相关推荐

  1. python图形编程基础知识_AI-图像基础知识-01|python基础教程|python入门|python教程

    目前人工智能Artificial Intelligence主要分为两大分支: 计算机视常见:Computer Vision,简称CV CV主要是研究如何让机器看懂世界的一种技术,通过各种光学传感器来代 ...

  2. 01 Python基础学习

    注:本次的环境使用 python-3.5.2 1 python 基础介绍 1.1 python 简介 1.1.1 python的对比 编码: 2.x = 默认编码 = ASSIC = 不支持中文 3. ...

  3. python语法基础知识总结-Python基础知识梳理 - 第01部分

    在开始Python基础知识梳理前, 先安装下环境. 以下过程是在Linux操作系统, root用户下进行的, 主要安装了2.7版本的python, 和pip, ipython, virtualenv等 ...

  4. python基础代码大全-python基础语法,python 代码命令大全

    python: 1.语法强制缩进 2.区分大小写:iLoop与iloop是两个变量 3.变量无需申明,但是变量赋值前无法使用:a=3合法,b=a+3合法,b=a+c不合法,因为c未赋值前不能使用 4. ...

  5. [Python面试][基础算法题]Python基础面试(基础算法题目较多)

    Python基础 文件操作 1.有一个jsonline格式的文件file.txt大小约为10K 2.补充缺失的代码 模块与包 3.输入日期, 判断这一天是这一年的第几天? 4.打乱一个排好序的list ...

  6. python基础知识点总结-python基础知识,python知识点汇总大一

    阶段一:Python开发基础 Python全栈开发与人工智能之Python开发基础知识学习内容包括:Python基础语法.数据类型.字符编码.文件操作.函数.装饰器.迭代器.内置方法.常用模块等. 阶 ...

  7. python入门基础知识教程-Python基础知识入门,这三个原则是你要知道的,还有教程...

    很多人都说Python是最容易入门的编程语言,但是入门Python,你必须要明白这三个原则. 否则,你一定很难入门Python. 第一,一定要从最简单的开始(尾部还有最简单的入门教程) 我接触过一些想 ...

  8. python基础知识资料-Python基础知识汇总

    原标题:Python基础知识汇总 1.Anaconda的安装 百度Anaconda的官网,下载左边的Python3.X版本 然后是设置路径,最后给出Jupyter notebook.具体参考: 猴子: ...

  9. python基础代码事例-python基础第三章

    第三章主要讲解Python的print语句的应用和赋值语句,代码块与缩进,条件语句,循环语句.这几种基础的语句 Python 条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者 ...

最新文章

  1. Smartmail外贸CRMBuild1.0版使用说明书
  2. Ubuntu中安装最新Docker社区版
  3. ElasticSearch,docker 安装ElasticSearch,Springboot 使用 ElasticSearch JavaAPI
  4. linux 如何查看应用程序进程号、端口
  5. 简单明了区分escape、encodeURI和encodeURIComponent
  6. LOJ:相框(欧拉回路、分类讨论)
  7. jboss4.2.3_JBoss 4.2.x Spring 3 JPA Hibernate教程
  8. 江阳职高计算机应用教改实验,计算机应用课程教改模式
  9. mac上sublime配置php环境,Mac下sublime text3如何配置php编译环境?
  10. [转]如何正确查看Linux机器内存使用情况
  11. java thread 线程_Java Thread类简述
  12. 【数据挖掘】数据挖掘总结 ( 模式挖掘 | Apriori 算法 | 支持度 | 置信度 | 关联规则 ) ★★
  13. 2019年中科院JCR分区表公布!附完整Excel下载地址
  14. CMake 编译时出现错误 coffe转换到 COFF 期间失败: 文件无效或损坏
  15. 印刷业ERP系统解决方案
  16. 人生这么短,哪有空嫌晚
  17. 获奖团队访谈录|“AI+无线通信”赛道三等奖团队
  18. 计算机录入员考试题及答案,计算机文字录入考试练习题
  19. 出走的门徒之二—摩拜 王晓峰:给岁月以文明
  20. ENVI 5.3汉化教程(适用于5.3以上版本)

热门文章

  1. Google Cloud Platform——GCP Messaging
  2. 分享---电脑软件多开方法
  3. Android开发之ExpandableListView: 可展开的ListView
  4. l36h android os,魅族FlymeOS 3.0适配索尼Xperia Z (L36h)官方ROM发布
  5. 【工业物联网】——污水处理远程监控系统
  6. 深入理解java反射机制
  7. Python毕业设计 二手房数据分析与可视化 - 大数据 网络爬虫
  8. asp.net网上房屋中介系统管理
  9. QML Canvas-雷达
  10. spring boot+iview 前后端分离架构之用户管理的实现(三十)