转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767

目录
        第一节 n阶幻方问题
       第二节 由n阶幻方引发的思考

正文

第一节 n阶幻方问题

所谓n阶幻方问题,俗称“横竖斜相加和相等”(我们当时就是这么叫的)。用术语说就是:在一个N行N列的方格表中,有1,2,3......N*N-1,N*N这N*N个整数,且其对角线、横行、纵行的数字和都相等。
       好了,在具体详解该问题之前,我们先看个例子,熟悉一下,如下图所示:

 
由上图可知,幻方有奇数阶幻方和偶数阶幻方两种,而偶数阶幻方又分为4m阶幻方和4m+2阶幻方两类。

1.奇数阶幻方
       我记得基数阶幻方有个口诀,有了这个口诀,走遍奇数幻方都不怕。其实这个口诀也是实现奇数幻方的步骤。

奇幻七绝
  先填上行正中央,
  依次斜填切莫忘。
  上格没有顶格填,
  顶格没有底格放。
我作图解释一下这首七绝。
       看着图是不是有点乱,具体每一步我就不做图说明了,你自己可以看着口诀写一下,挺有意思。要是感觉3*3方格写起来没有意思,你可以试一下5*5,7*7或者更大的。写完了之后看看横竖斜相加和是否相等。
附注:如果上述口诀有什么问题,请留言说明,谢谢!
注:按我的理解就是在第一行中间填数字1,然后依次向左上角填写数字2,3,4。。。。如果当前数字的左上角已经被占用,那么就在当前数字的下方填写,再依次向左上角按顺序填写
ok,奇数幻方就讲完了,就这么简单。权当找乐子!

2.偶数阶幻方
       说实话,偶数阶幻方我一直以为只有一种,就是2*n阶幻方问题。查了一下才知道偶数阶幻方也分为两小类。

①.4*n阶幻方
       4*n阶幻方的生成其实很简单,即对方格中对角线上的数据,先以一条对角线(称对角线一)为对称轴,交换另一对角线(称对角线二)的数据;然后以对角线二为对称轴,交换对角线一的数据。说的直白一点,假设矩阵名为MagicSquare,就是交换MagicSquare[i,j]和MagicSquare[n-1-i,n-1-j]。老办法,作图来说明。图如下:

好了,4*n阶幻方也晚了,怎么样,简单吧!自己动手试试吧。

②.4*n+2阶幻方
        4*n+2,乍一看就较4*n麻烦了,事实也是如此,不过它的思想也简单。就是将4*n+2看做2*(2*n+1),这样一来就转化成了四个2*n+1求幻方。
附注:下面的我以6阶幻方为例,那么,4*n+2=6,所以n=1。

我通过描述每个步骤加上图形的方式来表述4*n+2阶幻方实现的过程。

第一步:把整个表格分成4个(2*n+1)*(2*n+1)的小表格,分别叫A,B,C,D。见下图

第二步:这样A,B,C,D个小表格就成奇数幻方问题了。
       ①.将1,2,...,(2*n+1)*(2*n+1)这些数划分给A,并对A实现奇数幻方;
       ②.将(2*n+1)*(2*n+1)+1,...,2*(2*n+1)*(2*n+1)这些数划分给B,并对B实现奇数幻方;
       ③.将2*(2*n+1)*(2*n+1)+1,...3*(2*n+1)*(2*n+1)这些数划分C,并对C实现奇数幻方;
       ④.将3*(2*n+1)*(2*n+1)+1,...4*(2*n+1)*(2*n+1)这些数划分D,并对D实现奇数幻方。
见下图

第三步:从A表中的中心(即第n行的MagicSquare[n][n])开始,按照从左向右的方向,标出n个数,A表中的其他行则标出最左边的n格中的数(在图中用红色背景标出)。并且将这些标出的数和C表中的对应位置互换。见下图

第四步:在B表中的中心(如上解释)开始,自右向左,标出n-1列,将B中标出的数据与D表中对应位置的数据交换。但是6阶幻方中,n-1此时等于0,所以B与D不用做交换。

至此,这个幻方就成了,如下图。

附注:以上几个问题的程序就不送上了,有兴趣的朋友可以自己写一下。

第二节 由n阶幻方想到的

幻方问题就说完了,比较一下我还是感觉奇数阶幻方有意思,而且比偶数阶幻方问题容易些,没有那么麻烦。按说写到此本应该结束了,可是我突发奇想,n阶幻方这个问题利用数学知识很容就能解决,那么我想问一下大家:在平时写程序思考算法的时候,你是否会利用数学知识来解决问题呢?

假如这个问题让你在限定的时间内编程来实现.如果你对n阶幻方很了解,知道奇偶两种情况的做法,好,那没有问题,恭喜你!但是,恰巧你对n阶幻方不是很了解,也不知道奇偶阶幻方的做法,那这个问题你会怎么解决?用枚举还是用其他什么算法。这是你不得不考虑的。

说到这,我又想到了一个例子,如:求1,2,...,99,100的和,请编程实现。你会怎么做?这个确实很简单,我相信多数朋友都会用一个for或是一个while来解决问题。那还有没有更简单的办法呢?当然有,利用数学知识来解决,1,2,...,99,100就是一个等差数列,等差数列求和的公式S=(首项+末项)*项数/2,直接得出结果。哪个效率更高,不言而喻。所以说,数学知识在我们编程中很有用,只是我们经常考虑不到而已!

第三节 结束语

如果你有更有趣或者值得深思的题目请分享!

n阶幻方问题的更多相关文章

  1. 任意阶幻方(魔方矩阵)C语言实现

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  2. Java 实现任意N阶幻方的构造

    一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...

  3. Java 实现奇数阶幻方的构造

    一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...

  4. hdu1998 bjfu1272奇数阶幻方构造

    这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...

  5. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  6. n阶幻方

    前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...

  7. 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 ...

  8. C++求解N阶幻方

    由一道数学题的联想然后根据网上的做法瞎jb乱打了一下,居然对了代码精心附上了注释,有兴趣的童鞋可以看一看..不说了,上代码!(自认为结构很清晰易懂) 1234567891011121314151617 ...

  9. 【C++小白成长撸】--N阶幻方(魔阵)矩阵

    解决方法:1.第一个元素放在第一行中间一列 2.下一个元素存放在当前元素的上一行.下一列. 3.如果上一行.下一列已经有内容,则下一个元素的存放位置为当前列的下一行. 在找上一行.下一行或者下一列的时 ...

随机推荐

  1. Springboot+swagger2的接口文档开发

    一.创建一个SpringBoot项目 1. 2. 3. 4. 把web里的web选中,SQL里选择自己需要的,点击next 二.创建各项所需的controller,configure等 1. 项目布局 ...

  2. linux 空间不够了 修改 /boot

    1>  查看空间多少:df -h2>  查看当期内核: uname -r3>  查找内核   rpm -qa | grep kernel4>  删除多余的内核 yum remo ...

  3. python基础7(函数 Ⅱ)

    1.python代码运行遇到函数时 从python解释器开始执行之后,就在内存中开辟了一个空间 每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来. 但是当遇到函数定义的时候解释器只是象征性 ...

  4. sshd修改监听端口

    vi /etc/sshd/sshd_config ListenAddress 0.0.0.0 #修改为 ListenAddress 192.168.0.1 #代表只监听192.168.0.1的SSH请 ...

  5. C++根据扩展名获取文件图标、类型

    简述 在Windows系统中,根据扩展名来区分文件类型,比如:.txt(文本文件)..exe(可执行程序).*.zip(压缩文件),下面,我们来根据扩展名来获取对应的文件图标.类型. 简述 源码 源码 ...

  6. Qt之QDesktopServices

    简述 QDesktopServices类提供的函数用于访问常见的桌面服务. 许多桌面环境都会提供一系列服务,可以通过应用程序来执行常见任务,如:以用户应用程序首选项的方式,打开一个网页. 此类包含为服 ...

  7. 使用Javascript D3创建属于你的涂鸦作品

    Matplotlib能够用来创建非常美丽精确的数学图形: 可是有时候在进行想法交流的时候,不想那么严谨正式.想使用那种轻松的.涂鸦风格的图形: MATLAB XKCDify项目能够用来生成上述的涂鸦作 ...

  8. 关于nth-of-type和nth-child的关系

    一开始写样式的时候喜欢全部元素都来个class,后面发现这样一个页面下来很多个class,起名字起到发慌,然后老师说该多用 逻辑关系来写样式,就是这种第几个孩子啊这种,不知道你们有没有这种烦恼,要用的 ...

  9. 22.允许重复的容器(unordered_multiset)

    #include <string> #include <iostream> #include <unordered_set> using namespace std ...

  10. hdu 2018 - 递推

    dp[i][1..4] 第i年时年龄为1234的牛的数目 */ #include <cstdio> #include <cstring> ; ]; int main(){ me ...