魔方阵

问题描述

魔方阵是一个古老的智力问题,它要求在一个m×m的矩阵中填入1m2的数字(m为奇数),使得每一行、每一列、每条对角线的累加和都相等,如图1所示

15

8

1

24

17

16

14

7

5

23

22

20

13

6

4

3

21

19

12

10

9

2

25

18

11

1 五阶魔方阵示例

基本要求

  • 输入魔方阵的行数m,要求m为奇数,程序对所输入的m作简单的判断,如m有错,能给出适当的提示信息。

  • 实现魔方阵。

  • 输出魔方阵。

实现提示

本实验使用的数据结构是数组。

解魔方阵问题的方法很多,这里采用如下规则生成魔方阵。

  • 1开始填数,将1放在第0行的中间位置。

  • 将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:

    • 左上角超出上方边界,则在最下边相对应的位置填入下一个数字;

    • 左上角超出左边边界,则在最右边相应的位置填入下一个数字;

    • 如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

3×3魔方阵为例,说明其填数过程,如图2所示。

 

2 三阶魔方阵的生成过程

由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m。所以,位置(x,y)的左上角的位置可以用求模的方法获得,即:

x=(x-1+m)%m

y=(y-1+m)%m

如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。此时的xy已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即:

x=(x+2)%m

y=(y+1)%m

思考

  • 可以考虑使用其他方法生成魔方阵。任何算法都有不同的实现方法,通过采用不同实现方法来重新实现算法,这要比单纯学习算法的效果好得多。

#include<iostream>
#include<string.h>
using namespace std;
int main()
{int m;//阶数int x , y ;//横坐标,纵坐标int fz;//辅助数int number;//当前要进数组的数字cout<<"please input m"<<endl;while(cin>>m){if(m<=0)//输入判断{cout<<"input error,please input positive odd"<<endl;continue;}if(m%2==0)//输入判断{   cout<<"input error,please input positive odd"<<endl;continue;}fz = m;int mofang[m][m];//构建二维数组memset(mofang,0,sizeof(mofang));//清零mofang[0][m/2] = 1;//把1放到第一行中间x = 0 ;y = m / 2;number = 2;while(number <= m * m)//循环条件是进数组的数小于阶数的平方{if(x-1<0)//上方出界{if(y-1>=0)//左边没出界,把数插入到左边一行最下面{for(int i = 0 ; i < m ; i ++){if(mofang[fz-1][y-1]==0)break;else fz--;}mofang[fz-1][y-1]= number;number ++;x = fz-1;y = y -1;fz = m;}else//左边出界,把数插入到当前位置的下一行{mofang[x+1][y] = number;number ++;x = x + 1;fz = m;}}else if(y-1 < 0)//左边出界{for(int i = 0 ; i < m ; i++){if(mofang[x-1][fz-1]==0)break;else fz--;}mofang[x-1][fz-1]= number;number ++;x = x - 1;y = fz - 1;fz = m ;}else if(mofang[x-1][y-1]!=0)//左上角元素不为0{mofang[x+1][y] = number ;number ++;x = x+1;}else//插入左上角{mofang[x-1][y-1] = number ;x = x -1 ;y = y -1;number ++;}}for(int i = 0 ; i < m ; i++){for(int j = 0 ; j < m ; j++){cout<<mofang[i][j]<<"       ";}cout<<endl;}cout<<endl;}
}

  

转载于:https://www.cnblogs.com/Duskcl/p/3768884.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

专题训练5总结

这个专题学习了两种算法 1.稳定婚姻匹配问题 2.最大团问题 稳定婚姻匹配问题&#xff1a; 1.Stable Match 关于信号站匹配 多了一个容量的权值 如果距离相同看容量大小 数据处理较麻烦&#xff01; 2.marriage 稳定婚姻匹配问题入门题 3.The Stable Marriage problem 和入门题…

CodeSmith实用技巧(八):生成的代码输出到文件中

在CodeSmith中&#xff0c;要把生成的代码文件输出到文件中&#xff0c;你需要在自己的模版中继承OutputFileCodeTemplate类。<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /><% CodeTemplate Language"C#"TargetL…

python 3的33个保留字列表_python 33个保留字是什么意思

and 用于表达式运算&#xff0c;逻辑与操作as 用于类型转换assert 断言&#xff0c;用于判断变量或条件表达式的值是否为真break 中断循环语句的执行class 用于定义类continue 继续执行下一次循环def 用于定义函数或方法del 删除变量或者序列的值elif 条件语句 与if else 结合使…

SSH整合jar包下载

2019独角兽企业重金招聘Python工程师标准>>> http://blog.sina.com.cn/s/blog_8a3d83320100zhmp.html svn使用 spring 下载 http://maven.springframework.org/release/org/springframework/spring/4.0.5.RELEASE/ http://repo.spring.io/libs-release-local/org/sp…

面试之什么是java虚拟机

java虚拟机体系结构 方法区 堆 java虚拟机栈 本地方法栈方法区 java虚拟机编译的class文件中二进制数据类型解析数据存在方法区中 是所有线程共享和存在数据的线程安全问题 当二个线程使用同一类并且类还被加载 则让一个线程加载 另一个线程等待java虚拟机栈 是线程私有的 既决…

高质量c/c++编程(9)

第9章 类的构造函数、析构函数与赋值函数构造函数、析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意&#xff0c;其实这些貌似简单的函数就象没有顶盖的下水道那样危险。每个类只有一个析构函数和一个赋值函数&#xff0c;但可以有多个构造函数&#…

三合一剪弦器怎么用_三合一冲锋衣推荐选购攻略:

一、冲锋衣的类别二、三合一冲锋衣小评测。三、冲锋衣维护一、冲锋衣的类别冲锋衣分&#xff1a;硬壳、软壳&#xff0c;三合一&#xff0c;三种类型。软壳是介于抓绒衣和冲锋衣之间的衣服&#xff0c;防水上比硬壳差&#xff0c;只能防小雨&#xff0c;但优势在于活动方便&…

Celery 之异步任务、定时任务、周期任务

什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由 1.用户任务 app 2.管道 broker 用于存储任务 官方推荐 redis rabbitMQ / backend 用于存储任务执行结果的 3.员工 worker 一 异步任务 1 from celery import…

堆栈认知——栈溢出实例(ret2libc)

参考&#xff1a;栈溢出实例–笔记三&#xff08;ret2libc&#xff09; 地址&#xff1a;https://qingmu.blog.csdn.net/article/details/119481681 目录1、栈溢出含义及栈结构2、ret2libc基本思路3、实战3.1、二进制程序3.2、查看栈结构3.3、第一次栈溢出3.4、第二次栈溢出1、…

对”命令“操作的命令

乍一看这个标题有点拗口&#xff0c;什么叫对“命令”操作的命令呢&#xff1f;其实从字面上就可以理解我要表达的意思&#xff0c;今天这篇博客写的还是命令&#xff0c;但是这些命令有点不一样&#xff0c;不一样的地方在于这些命令操作的对象就是“命令”。1&#xff0c; t…

用代理技术实现简单的AOP框架

在许多的实现AOP框架的技术中&#xff0c;不管是静态织入还是动态织入&#xff0c;关键点在于拦截方法&#xff0c;并在方法中加入预处理和后处理。而实现方法的拦截的一个简单办法就是 把类的实例委托给类的真实代理(RealProxy).这样以来&#xff0c;方法的调用都会被转换成消…

halcon 单通道图像转成3通道_halcon图像处理基本运算

halcon图像处理基本运算图像处理最基本的操作包括颜色空间转换&#xff0c;各种代数运算&#xff0c;放射变换等。通过熟悉这些常见的操作&#xff0c;可以对图像有基本的认识&#xff0c;尤其是对刚开始接触视觉图像处理的人而言&#xff0c;熟悉这些操作&#xff0c;可以快速…

【HNOI2013】消毒

题面 题解 当只有二维时&#xff0c;就是一个二分图匹配的板子题 三维的时候就很好做了&#xff0c;暴力枚举一维的情况&#xff0c;因为\(\min(x,y,z) \sqrt{5000} < 18\)&#xff0c;于是时间复杂度有保证 代码 #include<cstdio> #include<cstring> #include…

ASP.NET MVC学前篇之Ninject的初步了解

ASP.NET MVC学前篇之Ninject的初步了解1.介绍废话几句&#xff0c;Ninject是一种轻量级的、基础.NET的一个开源IoC框架&#xff0c;在对于MVC框架的学习中会用到IoC框架的&#xff0c;因为这种IoC开源框架有很多&#xff0c;本篇的主题只有一个&#xff0c;就是让阅读过本篇幅的…

技术术语积累

目录ASCII码表ASCII打印字符ASCII非打印控制字符ASCII扩展打印字符C语言基本数据类型整型变量整型常量实数&#xff08;浮点&#xff09;类型实型&#xff08;浮点&#xff09;常量字符变量字符常量C语言中printf打印形式%2d&#xff0c;%-2d&#xff0c;%.2d&#xff0c;%02d&…

下滑加载更多js_专治:卫生间免砸砖,房顶漏水,JS堵漏王水不漏,厂家三包产品,免费成熟配方(点开看更多)...

免砸砖JS-堵漏王水不漏白色粉状&#xff0c;加水溶解后即为JS堵漏王水不漏。防水液&#xff0c;为无色透明液体&#xff0c;不燃、不爆、不腐蚀。本产品是新型多功能纳米水溶性防水剂。具有超强的渗透后微膨胀结晶功能&#xff0c;能充分填补填满物体毛细管&#xff0c;从而达到…

2010年亚运会前广州将大力推广清洁能源公交

中新社北京七月三日电 (记者 闫晓虹)当北京正在为二00八年奥运建设绿色公交的时候&#xff0c;广州公交也在为二0一0年的亚运会积极备战。广州计划在二0一0年亚运会召开之前&#xff0c;从外型设计、技术配置优化等方面进一步提高和完善LPG(液化石油气)公交车&#xff0c;并计划…

linux设置开机自启动

一.、在/etc/rc.local文件中添加自启动命令 执行命令&#xff1a; 编辑"/etc/rc.local"&#xff0c;添加你想开机运行的命令 运行程序脚本&#xff1a;然后在文件最后一行添加要执行程序的全路径。 例如&#xff0c;每次开机时要执行一个hello.sh&#xff0c;这个脚本…

JavaScript 初学者应知的 24 条最佳实践

原文&#xff1a;24 JavaScript Best Practices for Beginners &#xff08;注&#xff1a;阅读原文的时候没有注意发布日期&#xff0c;觉得不错就翻译了&#xff0c;翻译到 JSON.parse 那一节觉得有点不对路才发现是 2009 年发布的文章&#xff0c;不过还是不错的啦。另外&am…

正点原子FreeRTOS(下)

更多干货推荐可以去牛客网看看&#xff0c;他们现在的IT题库内容很丰富&#xff0c;属于国内做的很好的了&#xff0c;而且是课程刷题面经求职讨论区分享&#xff0c;一站式求职学习网站&#xff0c;最最最重要的里面的资源全部免费&#xff01;&#xff01;&#xff01;点击进…