魔方阵

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

问题3.1、n –魔方阵

一、提出问题

所谓“n – 魔方阵”是指由1至n 这n 个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。易知,这两个魔方阵的魔方常数分别为15和28。

321541543

24321

52154

35432

1 ,4

3217651

76543254321762176543654321732176547654321 图3 – 1 5 – 魔方阵和7 – 魔方阵

n – 魔方阵的数字排列很有规律,若用人工的方法给出并不困难。现在要求给出:能让计算机自动输出n (≥ 3)为奇数时形如图3 – 1所示的n – 魔方阵的算法。

二、简单分析

n – 魔方阵较我们之后将要讨论的奇、偶数阶魔方阵,要简单许多。观察后不难发现:

1.要填入的n 个数字在阵列的每一行和每一列都要出现且仅出现一次,且各行(列)中的数字顺序相同,这里的顺序是指循环顺序,其中数字1接在数字n 的后面。

2.从阵列的行来看,每一行的第一个数字与它上一行正中间的数字相同。

通过对“n – 魔方阵”的分析,下面几个基本问题必须得到解决:

◆ 如何确定阵列第一行各个数字?

◆ 在填入其他行的数字时如何保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行正中间的数字?

三、设计准备

假设我们要构建的是一个n – 魔方阵,为此定义一个有n 行n 列的二维数组。

1.确定阵列第一行各个数字

这里我们处理的方法很简单,即可以利用循环方法顺序地在二维数组第一行中填写1,2,3,…,n 这n 个自然数即可。

2.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行

正中间的数字

要解决这个问题,需借助一个有n + 1单元的一维数组,并对该数组进行若干次“循环左移”处理。所谓做一次“循环左移”,即指在一维数组中,将第1个数填入第n + 1个单元,第2个数填入第1个单元,……,第n个数填入第n– 1 个单元,最后再将第n + 1个单元中的数填入第n个单元。例如,二维数组第二行中各个数字的填入可按下面的方式得到:

第一步:在一维数组中依次填入与二维数组中第一行相同的数字;

第二步:对一维数组中的数字进行( n– 1 ) / 2次“循环左移”处理;

第三步:将一维数组其数字依次填入二维数组的第二行。

由于对数字的处理是“循环左移”,这样数字原有的顺序没有被改变。而要将处在正中间的数字变成处在第一位,只需将其向左移动( n– 1 ) / 2个单元,因此按上述方法处理后,二维数组中第二行所填入的数字满足我们的要求。

接下来,不断地对一维数组重复上方法的第二步,并将其结果中的数字依次地按顺序填入二维数组中的第三行、第四行,……,第n行即可。

3.其他要求的处理

这里我们提出另外的二项要求,即

(1)对输入的整数n,要保证是不小于3的奇数,不然就要重新输入;

(2)增加对构建好的阵列是否是魔方阵的判断,并对判断的结果输出成功或失败的信息。

对于第一个要求,可通过判断n /2 是否等于INT ( n / 2 ) 和n是否不小于3来实现。

对于第二个要求,可通过比较各行、列、对角线上元素之和是否与n ( n + 1 ) / 2的值相等来实现。

四、实施步骤

1.算法编制的工作顺序:

有了上述的设计准备,我们所要的算法可按如下的工作顺序编制:

第一步:输入奇整数n,并以此定义一维数组S和二维数组A;

第二步:将1至n这n个不同整数依次填入S的前n个单元;

第三步:通过对数组S实施“循环左移”处理,确定数组A中第二行至第n行中各单元的数字,并输出这些数字;

第四步:通过统计各行、列和对角线上各数字的和,判断输出的数字阵列是否是魔方阵。

2.变量设置:

N:魔方的阶数;

G:行、列和对角线上元素之和;

V:每行元素累计和;

U:每列元素累计和;

S:主对角线上的元素累计和;

R:次对角线上的元素累计和;

S:为循环左移工作的数组;

A:魔方阵(二维数组)。

3.参考框图:如图3 – 2 所示。

4.框图说明:框图应当包含三个功能部分。

第一个部分的功能是判断N是否是一个大于3的奇数;

定义S和A两个数组;产生1 ~ N这N个自然数,并存在在

S数组里;

第二个部分的功能是能够对S数组中的数字循环左移

( N– 1 ) / 2次;输出S数组中的数字以表示魔方的行元素,

并存放在A数组指定的行中。

实现循环左移(即产生和输出方阵的方法)可参考下面

的算法:

第01步:让S ( I ) ⇐ I,I = 1,2,…,N;图3 – 2 处理“素数魔方阵”问题的框图

第02步:让S ( N + 1 ) ⇐ S ( 1 );

第03步:让I⇐ 1;

第04步:让K⇐ 1;

第05步:让S ( M –1 ) ⇐S ( M ),M = 2,3,…,N + 1;

第06步:让S ( N + 1 ) ⇐ S ( 1 );

第07步:让K ⇐ K +1,若K≤(N –1)/ 2,则执行第05步;

第08步:让A ( I , J ) ⇐S ( J ),输出A ( I , J ),J =1,2,…,N ;

第09步:让I⇐ I + 1,若I≤N,则执行第04步;

第三个部分的功能是验证所输出的阵列是否正确,并以特别提示信息表示。

我们的验证工作,是通过比较各行、列、对角线上元素之和是否与N ( N + 1 ) / 2的值相等来实现。而各行、列、对角线上元素之和可参考如下的方式得到:

第01步:让I⇐ 1;

第02步:让U⇐U + A ( I , J ),J = 1,2,…,N;——产生第I行各元素的和。

第03步:让V⇐V + A ( J , I ),J = 1,2,…,N;——产生第I列各元素的和。

第04步:让P⇐P + A ( I , I );——产生主对角线上各元素的和。

第05步:让Q⇐Q + A ( I , N + 1 –I );——产生从对角线上各元素的和。

第06步:让I⇐I + 1,若I≤N,执行第02步;

5.参考算法

第01步:输入一个正整数N ;

相关文档
最新文档