admin 管理员组

文章数量: 1086019


2024年4月21日发(作者:加压舱属于几类压力容器)

问题3.1、

n –魔方阵

一、提出问题

所谓“n – 魔方阵”是指由1至n这n个不同整数构成的魔方阵,其魔方常数为n ( n + 1 ) / 2。

例如,5 – 魔方阵和7 – 魔方阵如图3 – 1所示。易知,这两个魔方阵的魔方常数分别为15和28。

12

34

51

23

45

1

345

4

512

7

234

3

451

6

123

2

2

5

1

4

3

6

2

5

4

7

3

6

5

1

4

7

6

2

5

1

7

3

6

2

712345

345671

5671234

图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.填入其他行的数字,并保证数字原有的顺序不改变同时每一行的第一个数字正好是其上一行

1

正中间的数字

要解决这个问题,需借助一个有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 :每列元素累计和;

2


本文标签: 数字 数组 顺序 方阵 填入