由n阶幻方问题引发的思考

来源:互联网 发布:南宁市公安局网络投诉 编辑:程序博客网 时间:2024/05/29 17:11
由n阶幻方问题想到的

前序

       最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子。在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻。看了看目录,一个个熟悉的问题又一次的展现在了我的面前,看着看着就翻到了n阶幻方这块(其实那时候我们不这么叫)。记得当时学这个问题的时候就感觉特别有意思,现在看看也是如此,于是乎便诞生了本片文章。
       本文用较大的篇幅先介绍了n阶幻方,因为这个问题挺有意思。但是本文的重点却在第二节---由n阶幻方引发的思考。

目录
        第一节 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或者更大的。写完了之后看看横竖斜相加和是否相等。
附注:如果上述口诀有什么问题,请留言说明,谢谢!

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,直接得出结果。哪个效率更高,不言而喻。所以说,数学知识在我们编程中很有用,只是我们经常考虑不到而已!

 

第三节 结束语

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

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小金鱼翻肚皮了怎么办 秋天树叶没了小鸟怎么办 去国外旅游不会英语怎么办 橡皮树长了2米高怎么办 榕树盆景长的高怎么办? 2岁宝宝看书弯腰低头怎么办 excel表格打开很慢怎么办 3d模型有红线框怎么办 电视页面加载时错误怎么办 投屏显示加载视频错误怎么办 word遇到问题需要关闭怎么办 画眼线看不出来怎么办 14岁眼皮很松怎么办啊 ps存不了psd格式怎么办 花草上有白色物怎么办 ps抠出来有白边头发怎么办 脸上结痂掉了有红印怎么办 海棠花瓣干枯怎么办茎变软 微信上的图片打不开怎么办 口红吊兰老掉叶子怎么办 翠叶竹芋叶子卷怎么办 牙有龋齿垫底以后酸怎么办 事业单位辞职请示30天不批怎么办 孕早期吃了油菜怎么办 实体店买到翻新苹果手机怎么办 太阳花叶子蔫了怎么办 刚摘下来的多肉怎么办 购车4s不给合同怎么办 橙光游戏2.0商城怎么办 飞羽花卷叶了怎么办 孔雀竹芋叶子发黄卷曲怎么办 孔雀竹芋叶子黄了卷了怎么办 飞羽竹芋叶尖黄怎么办 十七岁还是胸小怎么办 英雄联盟连接不上服务器怎么办 彩叶草叶子蔫了怎么办 家里种葱老是死怎么办 非洲菊生虫子了怎么办 多肉的花剪下来怎么办 结石痛怎么办怎么止疼 喝玫瑰花茶胃疼怎么办