N阶魔阵问题数据结构课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++) {