首页 > 其他分享 >【软件构造课程相关】幻方及其构造(上)

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

时间:2024-05-03 19:55:05浏览次数:18  
标签:右上方 continue 构造方法 幻方 构造 课程 填写

介绍

幻方(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阶幻方中所有的方格初始化为0

    squares[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不变; continue
            if(x<0)
            {
                x += n;
                continue;
            }

            //越右界y>=n,则y=y-n,x不变;continue
            if(y>=n)
            {
                y -= n;
                continue;
            }

            //如果已有数据,则移到x = x + 2;y = y - 1; continue
            if (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阶幻方的构造。由于此条博客为本人所撰写的第一条博客,本人对于博客园发布博客还不太了解,因此简短一点就此结束这条博客。关于另外两种幻方构造方法部分的拓展内容,我将在下一条博客中叙述。

未完待续

。。。

标签:右上方,continue,构造方法,幻方,构造,课程,填写
From: https://www.cnblogs.com/2022112842zbx/p/18171546

相关文章

  • simpread-课程 28:API 接口请求日志【后端】
    1、添加审核日志实体1.1实体定义在项目Electric.Entity,添加文件夹:AuditLogs,并添加类:EleAuditLog。EleAuditLog完整代码如下:namespaceElectric.Entity.AuditLogs;///<summary>///审核日志///</summary>[Index(nameof(AuditLogType))]publicclassEleAuditLog:E......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • 【排课小工具】排课程序设计与实现
    课表的完整性意味着,可分配的节点的数量大小等于课表周数的累加和大小,为了进行完整性检测我需要两个对象:课表模板以及课程对象,从课表模板中获取可分配的节点数,从课程对象中获取该课程的上课周次。用户要求每个班级的课表模板相同,这使得完整性检测容易很多。分级填充需求主要和课程......
  • dotnet Core 静态方法和构造方法
    //静态方法://特点:1.生命周期一旦创建-应用结束才会结束2.全局的3.效率高(放在内存中)//用户:用户登录,系统配置信息,系统设置,SQLHelper//注意:静态的东西创建多了,占用内存会很大//调用:静态方法调用非静态方法不能直接调用,要初始化(new一下)通过对象再去......
  • simpread-课程 27:系统日志之 ILogger 与 Log4Net
    一、ILogger介绍1.1简介ILogger是.NET框架提供的一个接口,用于统一不同日志库的调用方式。ILogger本身并不提供具体的日志记录功能,而是通过实现它的类来执行这些操作。所以我们可以借助第三方日志库或自定义实现ILoggerProvider,将日志消息写入到文件、控制台或数据库中,也......
  • 技术探秘:如何利用仪表构造InfiniBand流量在数据中心测试中的应用
    一、什么是Infiniband?在当今数据爆炸的时代,数据中心作为信息处理的中心枢纽,面临着前所未有的挑战。传统的通信方式已经难以满足日益增长的数据传输需求,而InfiniBand技术的出现,为数据中心带来了全新的通信解决方案。InfiniBand(IB)是一种高性能计算和数据中心网络架构,其设计目标是......
  • simpread-课程 24:工作单元之数据库事务【AOP】
    一、工作单元事务代码分析在上一个课程,我们已经实现了数据库事务功能,来保证数据的完整性。通过上一个课程的实现方式,我们在每一个Action开头和结尾,都需要添加对应的代码,才能实现事务功能,具体见以下截图:这种实现方式存在以下2个问题:在具体业务开发中,一个请求往往都会涉......
  • simpread-课程 21:API 项目重构
    项目结构重构1.1Electric.DbMigrator存在的问题我们先来看下,后台API项目的目录结构。其中Electric.DbMigrator,这个项目作用是用来做数据库迁移的,但是同时也会被其他项目引用,还有这个项目类型还是WebAPI类型的。所以存在以下的几个问题:1、项目功能重合:数据库迁移和数......
  • 构造题选讲 by_chance
    不知道会不会有方法论,先咕了。upd:有的捏,但是好像没啥用/qdARC145DNonArithmeticProgressionSet首先考虑如何构造\(n\)个数满足不存在\(2y=x+z\)。考虑一个分治:将值域均匀分成三部分,并且让所有数平分在第一部分和第三部分,直至为\(1\)就可以在值域内选一个位置扔进去。......
  • 构造函数的成员初始化列表
    为什么要初始化成员对于类成员是基础数据类型,例如int、char这些,构造对象时,成员不会被初始化,值是随机的。下面代码可以验证下:classA{public:A(){}voidshowMember()const{std::cout<<"a:"<<a<<std::endl;}private:inta;};int......