N阶魔阵问题数据结构课程设计

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

N阶魔阵问题2011年6月14日

数据结构课程设计

一、实验题目

给定一奇数n,构造一个n阶魔阵。n阶魔阵是一个n阶方阵,其元素由自然数1,2,3,…,n2组成。魔阵的每行元素之和,每列元素之和以及主、副对角线之和均相等。既对于给定的奇数n以及i=1,2,3,…,n。魔阵a满足以上条件。

要求:要求输出结果的格式要具有n阶方阵的形式。

提示:依次将自然数填入方阵中,共填n轮,每轮填n次。第一轮的第一次,将1填入方阵的中间一行的最后一列位置。设前一次填入的位置是a ij。

(1)每轮中第2至第n次将数填入a i+1,j+1,若遇到下列情况之一,则填写位置按以下规则调整:

①. a ij是最后一列(即j=n)位置,则将下一个数填入a i+1,1;

②. a ij是最后一行(即i=n)位置,则将下一个数填入a1,j+1;

(2)新一轮的第一次填入a

.

1,j-1

二、实验目的

一、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;

二、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;

三、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;

四、训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;

五、输出一个奇数N阶的具有矩阵形式魔阵。

三、实验内容

(一)需求分析

1. 定义一个整形变量order存放魔术矩阵的阶数

order为一整形变量,是通过键盘来进行输入的阶数,也是进行分析的条件,可通过形参的值传递到子函数中,再对魔术矩阵按照进行排列,要求如下:

n阶魔方矩阵是将自然数2,

放置在一个n

3,2,1n

n 的方阵中,同时要保证该矩阵

每行﹑每列及两条主对角线(即主对角线和副对角线)上的数值之和相等的要求。这似乎是一件比较复杂的事情,其实,求解“魔方矩阵”(奇数阶)有一个很巧 妙的算法,这个算法的 描述如下:

(1)初始化“魔方矩阵”,即将所有元素置为0; (2)首先将1放置在第1行的中间位置。

(3)将2

2n 之间的整数按照下列规则依次放置在方阵中:

如果上一个数值所放置的位置的右上方为空(该位置还没有放置数值),则当前数值被放置在一个数值的右上方;否则被放置在上一个数的正下方。

很显然,“魔方矩阵”中的数据具有明显的二维排列关系,因此应该选用二维数组表示待求解的“魔方矩阵”。

(4)对于给定的奇数n 以及1,2,3,i n =,魔方矩阵满足的条件用数学表示

如下:

∑∑∑∑=--======n

k k n k n

k kk n

k n

k ki ik a a a a 1

1,1

1

1

定义为整型,将其返回,在主程序中打印出来。 (5)显示“魔方矩阵”; 2. 算法流程图

在主函数中定义order 为整型,由键盘输入; 定义整型变量row ,column 来描述数组插入的位置;

(二) 概要设计

(1)定义的存储结构描述:

首先在函数首部定义:#define MAXSIZE 31

定义一个数组matrix[MAXSIZE][MAXSIZE];对n 阶魔术矩阵进行存储;其中matrix[MAXSIZE][MAXSIZE]的参数类型为整型,此数组的最大值定义为31,如果超出则会发生错误,

定义一个整型变量order ,将order 的值传到形参,在算法中对order 阶的矩阵排列,使其满足下列条件:

∑∑∑∑=--======n

k k n k n k kk n k n k ki ik a a a a 1

1,1

1

1

因此称这样的矩阵为魔术矩阵;在算法程序中定义matrix[MAXSIZE][MAXSIZE];其中定义为整型,将其返回,在主程序中打印出来。 算法分析:

①.下面一段程序是用来限制输入的魔方矩阵的阶数所用: if (order>MAXSIZE)

{printf("\n 取值超出范围:\n");

printf("\n*******************************"); }

else if (order%2==0)

{printf("\n 输入有错误,请重新输入:\n"); printf("\n*******************************"); }

②.下面一段程序是求解N 阶魔方矩阵最关键的部分:首先将1放置在第1行的中间位置。将22n 之间的整数按照下列规则依次放置在方阵中:

如果上一个数值所放置的位置的右上方为空(该位置还没有放置数值),则当前数值被放置在一个数值的右上方;否则被放置在上一个数的正下方。

row=0; /* start of from the middle */ column=order/2; /* of the first row. */

for (count=1;count<=order*order; count++)

{

matrix[row][column] = count; /* put next # */

if (count % order == 0) /* move down ? */

row++; /* YES, move down one row */

else

{ /* compute next indices */

row = (row == 0) ? order - 1 : row - 1;

column = (column == order-1) ? 0 : column + 1;

}

}

printf("\n\n%d阶魔方阵如下:\n\n", order);

for (row=0; row < order; row++)

{

for (column = 0; column < order; column++)

printf("%4d", matrix[row][column]);

printf("\n");

}

(三)详细设计

利用数组构造N阶魔阵,其N为奇数,并且取一定的范围。然后对该魔阵的正确性进行检验。根据魔阵的特性,需要对列、行、主对角线、副对角线进行检验,看是否相等。

1、设计函数输出所要求的魔阵即构造满足

∑∑

=

--

= ===

=

=

n

k

k n

k

n

k kk

n k

n

k

ki

ik

a

a

a

a

1

1

,

1

11

的矩阵:row=0; /* start of from the middle */ column=order/2; /* of the first row. */ for (count=1;count<=order*order; count++) {

相关文档
最新文档