【软件构造课程相关】幻方及其构造(上)

news/2024/10/12 16:29:33

介绍

幻方(Magic Square),有时又称魔术方阵或纵横图,由一组排放在正方形中的整数组成,其每行、每列以及每一条主对角线的和均相等。通常幻方由从1到$N2$的连续整数组成,其中N为正方形的行或列的数目。因此N阶幻方有N行N列,并且所填充的数为从1到$N2$。

​ 幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数S(N),如果填充数为$1$,$2$,…,$N2$,那么有$S(N)=N(N2+1)/2$。

构造方法

​ 根据构造方法的不同,幻方可以分成三类:奇数阶幻方、4M阶幻方和4M+2阶幻方,其中M为自然数,2阶幻方不存在。古往今来,人们实现的幻方构造法有许多种,在此我仅就这三类幻方,每一类给出一个通用的构造方法。

奇数阶幻方

​ 奇数阶幻方的构造是最为简单的,也是我们软件构造课程实验中要求我们实现的构造法。对于这一幻方的构造,我们可以采用Merzirac法。说明如下:

  • 把1放置在第一行的中间。
  • 顺序将$2,3,…N^2$依次放在前一个数的右上方格中。

  • 当右上方格行或列出界的时候,则由另一边进入。

  • 当右上方格中已经填有数或行列均出界,则把数填入正下方的方格中。

  • 按照以上步骤直到填写完所有$N^2$个方格。

(由于幻方的对称性,也可以把右上改为右下、左上以及左下等方位)

​ 我们可以通过一个例子来更深的理解这个构造方法。对三阶幻方,1填写在(1,2)(第一行第二列)的位置上;2应当填写在其右上方格即(0,3)中,由于(0,3)超出顶边界,所以从最底行进入,即(3,3);3应当填写在(3,3)的右上方格(2,4)中,由于(2,4)超出右边界,所以从最左列进入,即(2,1);4应当填写在(2,1)的右上方格(1,2)中,由于(1,2)已经被1所占据,因此填写在(2,1)的正下方格(3,1)中;5填写在(3,1)的右上方格(2,2)中;6填写在(2,2)的右上方格(1,3)中;7应当填写在(1,3)的右上方格(0,4)中,由于(0,4)同时超出行边界与列边界,因此填写在(1,3)的正下方格(2,3)中;8应当填写在(2,3)的右上方格(1,4)中,由于(1,4)超出右边界,所以从最左列进入,即(1,1);9应当填写在(1,1)的右上方格(0,2)中,由于(0,2)超出顶边界,所以从最底行进入,即(3,2)。按照上面的步骤便可将所有数填入,三阶幻方构造完毕。其全过程示意图如下:

​ 需要注意的是幻方并不是唯一的,这只是用该方法构造的幻方,如果采用其他构造法得到不同的幻方是很正常的。

​ 知道了构造思路,便很容易用java语言实现这一构造方法,代码如下:

public static void magic_square_odd_generate()
{squares = new int[n][n];//n阶幻方中所有的方格初始化为0squares[0][(n-1)/2] = 1;int x = 0,y = (n-1)/2;//count:所有待插入的数for(int count = 2; count <= n * n; count++){//先移动到上一位置的右上方格x--;y++;//循环判断是否越界,直到一个方格不越界为止while(true){//越上界x<0,则移到最下方x=x+n,y不变; continueif(x<0){x += n;continue;}//越右界y>=n,则y=y-n,x不变;continueif(y>=n){y -= n;continue;}//如果已有数据,则移到x = x + 2;y = y - 1; continueif (y<0){y+=n;continue;}if(squares[x][y] != 0 ){x += 2;y -= 1;if (x>=n){x-=n; continue;}if (y<0){y+=n;continue;}continue;}break;}//将当前的count值赋给选出的方格squares[x][y]= count;}
}

​ 至此,课程要求的构造方法已经完成,但是我们对幻方的探索还远远没有结束,我们还没有实现4M阶幻方和4M+2阶幻方的构造。由于此条博客为本人所撰写的第一条博客,本人对于博客园发布博客还不太了解,因此简短一点就此结束这条博客。关于另外两种幻方构造方法部分的拓展内容,我将在下一条博客中叙述。

未完待续

。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

SDL库基础学习

初始化 int SDL_Init(Uint32 flags);* `flags` may be any of the following ORd together:** - `SDL_INIT_TIMER`: timer subsystem* - `SDL_INIT_AUDIO`: audio subsystem* - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events* subsystem* - `SDL…

2024-5-1 假期第一天 愉快

假期第一天,中午十点多醒的,经过一番挣扎之后还是下定决心去本部开点二硫化硒,于是坐地铁去本部,到了发现皮肤科不开,遂返回,虽然无功而返吗,但是今天天气是真的好,路上骑行看到的风景很美,回来的时候去物美逛了一圈买了点香蕉,买了点饮料,然后又花30买了两杯喜茶,…

WPF上位机 - 使用转换器实现TIA Wincc中的可见性和外观功能

在TIA Wincc 中有这样的功能,使用True or false 控制控件的可见性或者外观的情况。在上位机中需要使用转换器这样对True or false 值转换为 需要的笔刷或者Visible属性。 using System; using System.Collections.Generic; using System.Globalization; using System.Linq; us…

Spring AOP

AOP简介A0P(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构OOP(object Oriented Programming)面向对象编程作用:在不惊动原始设计的基础上为其进行功能增强 Spring理念:无入侵式/无侵入式AOP核心概念连接点(JoinPoint):程序执行过程…

本地化部署hoppscotch —— 使用docker compose一键部署 + https支持

一、前言 研究了好久,终于完成了hoppscotch本地一键部署,并支持https。hoppscotch的介绍这里就不做过多描述,网络上非常多,这里先放几张使用效果 1、api界面 2、管理界面 2、部署效果: a.使用脚本,./create_and_start.sh(后面会提供),需要传入本机ip(能访问到的),…

关于stm32F103ZET6移植到stm32F103C8T6的步骤

在一次代码移植过程中,突然发现代码移植后不可以使用,代码是stm32f103zet6的代码,刚好当时我使用的是C8T6的芯片我进行移植到C8T6芯片时,代码报错"Error:Flash Download failed - "Cortex_M3"这种报错。当时直接懵逼了。想了半天没有想到原因,我就在想不都…

西门子S200伺服如何清除安全配置未受保护报警提示?

1, 新建用户 2, 设置用户名和密码 及权限范围; 3, 默认用户权限限制; 断电重启即可消除报警;

Spark中的闭包引用和广播变量

闭包引用 概念所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量。Spark中,普通的变量是在Driver程序中创建的,RDD的计算是在分布式集群中的task程序上进行的。因此,当分布式算子的函数引用了外部的变量时,Driver会把该变量序列化后通过网络发送给每一个…